Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

21

26.10.2004, 12:54

ich habe es jetzt so gemacht, dass ich die tbProceedTo3DSChunk und die Read3DSMaterialChunk funktionen wie folgt abgeändert habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// ******************************************************************

// Schreitet bis zu einem bestimmten Chunk fort

tbResult tbProceedTo3DSChunk(tbVFile* pVFile,
                             WORD wChunkID)
{
    tb3DSChunkHeader    ChunkHeader;
    int                 Cursor;
    bool                Error;

    // Cursor speichern

    Cursor = pVFile->GetCursor();
    Error = FALSE;

    // So lange lesen, bis der Chunk gefunden ist oder ein Fehler auftritt

    while(TRUE)
    {
        if(pVFile->Read(sizeof(tb3DSChunkHeader), &ChunkHeader)) Error = TRUE;
        if(ChunkHeader.wChunkID == wChunkID) return TB_OK;
        else if(pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader))) Error = TRUE;
        if(Error) {
            // Chunk nicht gefunden, wieder an alte Stelle springen

            pVFile->Seek(TB_VFSO_START, Cursor);
            return TB_ERROR;
        }
    }
}

// ******************************************************************

// Liest einen Material-Chunk einer 3DS-Datei

tbResult Read3DSMaterialChunk(tbVFile* pVFile,
                              tb3DSMaterial* pOut)
{
    tb3DSChunkHeader    ChunkHeader;
    BYTE                r;
    BYTE                g;
    BYTE                b;
    WORD                wPercentage;
    WORD                wShading;


    while(TRUE)
    {
        // Chunk-Header lesen

        if(pVFile->IsEOF()) return TB_OK;
        if(pVFile->Read(sizeof(tb3DSChunkHeader), &ChunkHeader)) return TB_ERROR;

        // Chunk verarbeiten

        switch(ChunkHeader.wChunkID)
        {
        case 0xA000: // Materialname

            // Name einlesen und speichern

            ReadASCIIZString(pVFile, 256, pOut->acName);
            break;

        case 0xA010: // Indirekte Farbe

        case 0xA020: // Streufarbe

        case 0xA030: // Glanzfarbe

            // Farbe lesen

            if(tbProceedTo3DSChunk(pVFile, 0x0011))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(BYTE), &r);
                pVFile->Read(sizeof(BYTE), &g);
                pVFile->Read(sizeof(BYTE), &b);

                // Farbe ins Fließkomma-RGB-Format umwandeln und speichern

                switch(ChunkHeader.wChunkID)
                {
                case 0xA010: pOut->AmbientColor = tbColor((BYTE)(r), g, b, 0); break;
                case 0xA020: pOut->DiffuseColor = tbColor((BYTE)(r), g, b, 255); break;
                case 0xA030: pOut->SpecularColor = tbColor((BYTE)(r), g, b, 0); break;
                }
            }
            break;

        case 0xA040: // Glanzstärke

            if(tbProceedTo3DSChunk(pVFile, 0x0030))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(WORD), &wPercentage);
                pOut->fShininess = (float)(wPercentage) / 100.0f;
            }
            break;

        case 0xA041: // Glanzmultiplikator

            if(tbProceedTo3DSChunk(pVFile, 0x0030))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(WORD), &wPercentage);
                pOut->fSpecularPower = (float)(wPercentage) / 100.0f;
            }
            break;

        case 0xA050: // Transparenz

            if(tbProceedTo3DSChunk(pVFile, 0x0030))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(WORD), &wPercentage);
                pOut->fOpacity = (float)(100 - wPercentage) / 100.0f;
                if(wPercentage != 0) pOut->bBlended = TRUE;
            }
            break;

        case 0xA080: // Eigenfarbe

            if(tbProceedTo3DSChunk(pVFile, 0x0011))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(BYTE), &r);
                pVFile->Read(sizeof(BYTE), &g);
                pVFile->Read(sizeof(BYTE), &b);
                pOut->SelfIllumination = tbColor((BYTE)(r), g, b, 0);
                pOut->bSelfIllumColor = TRUE;
            }
            break;

        case 0xA081: // Zweiseitiges Material

            pOut->bTwoSided = TRUE;
            break;

        case 0xA084: // Selbsterhellung

            if(tbProceedTo3DSChunk(pVFile, 0x0030))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                pVFile->Read(sizeof(WORD), &wPercentage);
                pOut->fSelfIllumination = (float)(wPercentage) / 100.0f;
            }
            break;

        case 0xA085: // Drahtmaterial

            pOut->bWire = TRUE;
            break;

        case 0xA100: // Shading

            pVFile->Read(2, &wShading);
            if(wShading == 1) pOut->bNoShading = TRUE;
            break;

        case 0xA200: // Textur

        case 0xA210: // Opazitäts-Map

            if(tbProceedTo3DSChunk(pVFile, 0xA300))
                pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
            else {
                switch(ChunkHeader.wChunkID)
                {
                case 0xA200:
                    ReadASCIIZString(pVFile, 256, pOut->acTextureMap);

                    // Bei einer TGA-Datei ist es wahrscheinlich, dass sie einen Alphakanal enthält.

                    // Daher wird in diesem Fall die Variable bBlended auf TRUE gesetzt.

                    if(!stricmp(tbGetFilenameExtension(pOut->acTextureMap), "tga")) pOut->bBlended = TRUE;
                    break;

                case 0xA210:
                    ReadASCIIZString(pVFile, 256, pOut->acOpacityMap);
                    pOut->bBlended = TRUE;
                    break;
                }
            }
            break;

        default:
            // Es scheint ein unwichtiger Chunk zu sein. Möglicherweise ist es aber auch

            // bereits einer, der von dieser Funktion nicht behandelt wird. In dem Fall

            // wird die Datei zurückgefahren und die Kontrolle wird an die übergeordnete

            // Funktion zurückgegeben.

            if(  (ChunkHeader.wChunkID >= 0x1000 && ChunkHeader.wChunkID < 0xA000)
                || ChunkHeader.wChunkID >= 0xAFFF)
            {
                if(pVFile->Seek(TB_VFSO_CURSOR, -(int)(sizeof(tb3DSChunkHeader)))) return TB_ERROR;
                return TB_OK;
            }

            // Chunk überspringen

            if(pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader))) return TB_ERROR;
            break;
        }
    }

    return TB_OK;
}


die tbProceedTo3DSChunk funktion springt jetzt, falls der gesuchte chunk nicht gefunden wird, wieder an ihre ausgangsstelle zurück. in Read3DSMaterialChunk wird überprüft, ob der chunk gefunden wurde, wenn nicht wird er einfach übersprungen. somit übergeht er nicht mehr einfach die komplette datei. das material wird jetzt leider mit sicherheit noch nciht richtig eingelesen, aber ich hab lleider keine informationen über den aufbau des material chunks gefunden....

22

29.10.2004, 18:07

Hi Leute,
möchte Euch mal einen kleinen 3ds - Modeller empfehlen - Freeware : http://www.anim8or.com/
nofi

Player140

Frischling

Beiträge: 10

Beruf: Schüler

  • Private Nachricht senden

23

08.11.2004, 17:41

Hm, ich habe nun auch ein Problem, und man hat mich damit zu dir geschickt Dave :huhu:

Also, es geht um folgendes:
Ich brache umbedingt ein Plug In für Cinema 4D welches mir erlaubt, 3ds Daten mit mehr als 8.3 Zeichen pro Textur zu exportieren! Hast du so etwas bereits programmiert? Ich selbst kann das leider nicht, da ich nur im Bereich Grafikdesign Fit bin :rolleyes:

Vielleicht kannst dur mir mal antworten, oder ne Mail an DanWeEtz@Web.de schreiben!

Danke schon mal :wirbel:

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

24

08.11.2004, 18:26

mir ist auch schon aufgefallen, dass cinema die texturnamen abschneidet, warum auch immer. eigentlich sind im 3ds-format 256 zeichen für die namen vorgesehen, insofern frage ich mich, warum.
was solls... hat mich jetzt nicht sonderlich gestört, deswegen hab ich mich damit auch nicht weiter beschäftigt, was ist denn daran so schlimm? kannst du deine texturen nicht einfach umbennenen? dürfte weniger arbeit sein, als nen plugin zu schreiben....

Player140

Frischling

Beiträge: 10

Beruf: Schüler

  • Private Nachricht senden

25

08.11.2004, 19:16

1200 Texturen umzubenennen (und das ist nicht übertrieben) und dannach noch allen, die die Mod ziehen, mitzugeben, obwohl sie sie schon haben, nur eben mit anderem Namen, das machst du mir mal vor, das das weniger arbeit ist :-D

Aber dich werde ich jetzt mal aufklären :P

das 3ds Format hat IMMMER nur 8.3 Zeichen pro textur! das 256 bezieht sich auf die möglichen Texturen, die exportiert werden können! das heist, man kann nur 256 Materialien mit exportieren! DAnn gibts auserdem noch ne Polygone begrenzung bei 65 oder 64 k glaube ich, weis aber nicht genau!

Also keiner, der Ein Plug In schreibt, oder hat ??? Schade!

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

26

08.11.2004, 19:42

du bittest hier mich um hilfe, also komm mir nicht so :P

die max. vertexanzahl ist glaub ich knapp unter 33.000 vertizes pro modell chunk, dann splittet er. von ner max polygonanzahl ist mir nichts bekannt, das liegt dann am programm und nicht am dateiformat.

für den namen eines materials, sowie für den dateinamen einer textur werden 256 byte bereitgestellt, da bin ich mir relativ sicher.

Player140

Frischling

Beiträge: 10

Beruf: Schüler

  • Private Nachricht senden

27

08.11.2004, 19:51

Hä? 256 Byte? Ich dachte, du meinst Zeichen? Also Zeichen 8.3! Da bin ich mir sowas von 100 PRo sicher, das glaubst du gar nicht! Da kann mich nicht mal der Programmierer des Formates persönlich von überzeugen, das das anders währe ;), das ist schließlich auch in 3ds Max so, da gibts allerdings son plug in für
Ansonsten steht das auch in allen 3ds Max Datei Dokumentationen und in zich foren und soweiter!

Und was ist nun mit der Hilfe Mister? :P Darf ich noch hoffen :angel: , oder eher nicht :help: ?? :o ??

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

28

08.11.2004, 20:00

ein char ist 1 byte groß. also kann man in 256 byte 256 zeichen unterbringen (btw. sinds eigentlich nur noch 255, da es in der regel nullterminierte zeichenketten sind).
es kann gut sein, dass 3ds nur 8.3 lange dateinamen verwalten kann, aber im dateiformat sind 256byte dafür platz, ka ahnung warum.

was hast du dir denn in bezug auf das plugin so vorgestellt? was soll es denn genau machen?
hasz du als ausgangpunkt ne 3ds datei, n welcher die dateinamen aller nur 8.3 zeichen lang sind und willst diese dann mit cinema exportieren? in was? und wie soll das plugin aus den gekürzten namen die kompletten erstellen?

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

29

08.11.2004, 20:17

mhh, hab ne kleinigkeit übersehen....
maximal 8.3 zeichen stimmt schon, mehr platz ist auch nicht. wär ja auch komisch gewesen.

aber das macht das genaze ja nicht besser, eher schlechter. wie willst du also deine langen dateinamen ins 3ds format packen? oder willst du in ein eigenes format exportieren?

Player140

Frischling

Beiträge: 10

Beruf: Schüler

  • Private Nachricht senden

30

08.11.2004, 21:39

Gott bewahre mich!!! Ein eigenes Format nicht :-D, das würde mir ja noch mehr arbeit machen! Nene, ich kann in dem Programm, in das ich das bringen will, eh nur 3ds Daten rüber laden

Also will ich ein Plug In für CINEMA 4D 8.5, das folgendes beim Exportieren in das *.3ds Format erlaubt:

- maximal 1024 materialien (256 zuvor)
- max MAX_PATH (260) chars for bitmaps (8.3 before)
- max MAX_PATH (260) chars for some objects (mats)

Hier ist auf jeden Fall schon einmal ein Exporter, für 3d Studio Max (musst du glaub ich mit IZarc entpacken, winRAR und winzip versagen bei mir irgendwie), welcher die oben genannten Features erlaubt, falls das weiter hilft, und hier kann man das 3ds Format anschauen:
http://www.wotsit.org/

Sag mir doch mal, ob du nun lust bekommen hast, mir mit einem Plug In behilflich zu sein

:) Dann währst du so ziehmlich der erste!!

Werbeanzeige