26#define MAGICNUMBER 0xB3D0
29#define CHUNKMAIN 0x4D4D
30#define CHUNKMAINVERSION 0x0002
32#define CHUNK3DVERSION 0x3D3E
33#define CHUNK3DOBJECT 0x4000
34#define CHUNK3DOBJECTMESH 0x4100
35#define CHUNK3DOBJECTMESHVERTICES 0x4110
36#define CHUNK3DOBJECTMESHFACES 0x4120
37#define CHUNK3DOBJECTMESHMATGROUP 0x4130
38#define CHUNK3DOBJECTMESHMAPPING 0x4140
40#define CHUNK3DMATERIAL 0xAFFF
43#define MATDIFFUSE 0xA020
44#define MATSPECULAR 0xA030
45#define MATTRANSPARENCY 0xA050
48#define COLOR_24 0x0011
49#define LIN_COLOR_24 0x0012
50#define LIN_COLOR_F 0x0013
51#define INT_PERCENTAGE 0x0030
52#define FLOAT_PERCENTAGE 0x0031
73typedef struct _Chunk {
75 UInt_t offset, len, endoffset;
79typedef struct _Vertex {
101 sprintf(matname,
"");
104 numverts = numfaces = 0;
116Int_t ReadChunk(FILE *, Chunk *);
119Int_t ReadMainChunk(FILE *);
123Int_t ReadVerticesChunk(FILE *);
124Int_t ReadFacesChunk(FILE *);
125Int_t ReadMappingChunk(FILE *);
126Int_t ReadASCIIZ(FILE *,
char *);
130Int_t ReadObjectMaterial(FILE *);
137Int_t nummaterials = 0;
138Material *material[1024];
141Int_t Read3DSFile(
const char *fname)
147 infile = fopen(fname,
"rb");
149 printf(
"Error : Input File Could Not Be Opened!\n");
153 if (ReadMainChunk(infile) != 0) {
154 printf(
"Error : Input File Could Not Be Read!\n");
161Int_t ReadChunk(FILE *
f, Chunk *
c)
168 c->offset =
c->len = 0;
171 fread(&
c->len,
sizeof(
UInt_t), 1,
f);
172 c->endoffset =
c->offset +
c->len;
177Int_t ReadMainChunk(FILE *
f)
183 ReadChunk(
f, &chunk);
184 if (chunk.idnum != CHUNKMAIN)
186 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
187 if (chunk.idnum == CHUNK3D) {
188 Read3DChunk(
f, chunk.endoffset);
191 fseek(
f, chunk.offset + chunk.len, SEEK_SET);
204 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
205 if (chunk.idnum == CHUNK3DOBJECT) {
206 ReadObjectChunk(
f, chunk.endoffset);
207 fseek(
f, chunk.endoffset, SEEK_SET);
208 }
else if (chunk.idnum == CHUNK3DMATERIAL) {
209 ReadMaterialChunk(
f, chunk.endoffset);
210 fseek(
f, chunk.endoffset, SEEK_SET);
212 if (chunk.endoffset < len) {
214 fseek(
f, chunk.endoffset, SEEK_SET);
230 material[nummaterials] =
new Material();
231 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
232 if (chunk.idnum == MATNAME) {
234 strcpy(material[nummaterials]->
name,
name);
235 fseek(
f, chunk.endoffset, SEEK_SET);
236 }
else if (chunk.idnum == MATDIFFUSE) {
237 ReadColor(
f, chunk.endoffset);
238 fseek(
f, chunk.endoffset, SEEK_SET);
239 }
else if (chunk.idnum == MATTRANSPARENCY) {
240 ReadTransparency(
f, chunk.endoffset);
241 fseek(
f, chunk.endoffset, SEEK_SET);
243 if (chunk.endoffset < len) {
245 fseek(
f, chunk.endoffset, SEEK_SET);
262 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
263 if (chunk.idnum == LIN_COLOR_24) {
264 fread(&material[nummaterials]->color[0],
sizeof(
UChar_t), 1,
f);
265 fread(&material[nummaterials]->color[1],
sizeof(
UChar_t), 1,
f);
266 fread(&material[nummaterials]->color[2],
sizeof(
UChar_t), 1,
f);
267 fseek(
f, chunk.endoffset, SEEK_SET);
268 }
else if (chunk.idnum == COLOR_24) {
269 fread(&material[nummaterials]->color[0],
sizeof(
UChar_t), 1,
f);
270 fread(&material[nummaterials]->color[1],
sizeof(
UChar_t), 1,
f);
271 fread(&material[nummaterials]->color[2],
sizeof(
UChar_t), 1,
f);
272 fseek(
f, chunk.endoffset, SEEK_SET);
273 }
else if (chunk.idnum == LIN_COLOR_F) {
277 fseek(
f, chunk.endoffset, SEEK_SET);
278 }
else if (chunk.idnum == COLOR_F) {
282 fseek(
f, chunk.endoffset, SEEK_SET);
284 if (chunk.endoffset < len) {
286 fseek(
f, chunk.endoffset, SEEK_SET);
303 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
304 if (chunk.idnum == INT_PERCENTAGE) {
306 material[nummaterials]->transparency = stransp;
307 fseek(
f, chunk.endoffset, SEEK_SET);
308 }
else if (chunk.idnum == FLOAT_PERCENTAGE) {
309 fread(&ftransp,
sizeof(
float), 1,
f);
310 fseek(
f, chunk.endoffset, SEEK_SET);
312 if (chunk.endoffset < len) {
314 fseek(
f, chunk.endoffset, SEEK_SET);
324Int_t ReadObjectMaterial(FILE *
f)
328 ReadASCIIZ(
f, model.matname);
340 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
341 if (chunk.idnum == CHUNK3DOBJECTMESH) {
342 ReadMeshChunk(
f, chunk.endoffset,
name);
344 if (chunk.endoffset < len) {
346 fseek(
f, chunk.endoffset, SEEK_SET);
364 sprintf(model.name,
"%s", objname);
365 printf(
"Reading Mesh : %s\n", objname);
366 while ((ReadChunk(
f, &chunk) == 0) && (!feof(
f))) {
367 if (chunk.idnum == CHUNK3DOBJECTMESHVERTICES) {
368 ReadVerticesChunk(
f);
369 }
else if (chunk.idnum == CHUNK3DOBJECTMESHFACES) {
371 }
else if (chunk.idnum == CHUNK3DOBJECTMESHMAPPING) {
373 }
else if (chunk.idnum == CHUNK3DOBJECTMESHMATGROUP) {
374 ReadObjectMaterial(
f);
376 if (chunk.endoffset < len) {
378 fseek(
f, chunk.endoffset, SEEK_SET);
385 if (model.vlist != 0)
386 delete[] model.vlist;
387 if (model.flist != 0)
388 delete[] model.flist;
392 sprintf(model.name,
"");
398Int_t ReadVerticesChunk(FILE *
f)
407 printf(
"Reading %i Vertices...", numv);
409 if (model.vlist == 0) {
410 for (i = 0; i < numv; i++) {
415 printf(
"\nWarning : Insufficient Memory to Load Vertices!\n");
418 for (i = 0; i < numv; i++) {
419 fread(&model.vlist[i].x,
sizeof(
Float_t), 1,
f);
420 fread(&model.vlist[i].y,
sizeof(
Float_t), 1,
f);
421 fread(&model.vlist[i].z,
sizeof(
Float_t), 1,
f);
429Int_t ReadFacesChunk(FILE *
f)
437 printf(
"Reading %i Faces...", numf);
438 model.flist =
new Face[numf];
439 if (model.flist == 0) {
440 for (i = 0; i < numf; i++) {
446 printf(
"\nWarning : Insufficient Memory to Load Faces!\n");
449 for (i = 0; i < numf; i++) {
464Int_t ReadMappingChunk(FILE *
f)
472 printf(
"Reading %i Texture Coordinates...", numuv);
473 if (numuv != model.numverts) {
474 for (i = 0; i < numuv; i++) {
478 printf(
"\nWarning : Number of Vertices and Mapping Data do not match!\n");
481 for (i = 0; i < numuv; i++) {
482 fread(&model.vlist[i].u,
sizeof(
Float_t), 1,
f);
483 fread(&model.vlist[i].v,
sizeof(
Float_t), 1,
f);
498 fread(&
c,
sizeof(
char), 1,
f);
505 }
while ((
c != 0) && (!feof(
f)));
517 if (ts[nummodels] == 0)
519 for (i = 0; i < model.numverts; ++i) {
522 for (i = 0; i < model.numfaces; ++i) {
525 ts[nummodels]->
SetName(model.name);
528 for (i = 0; i < nummaterials; i++) {
529 if (strcmp(model.matname, material[i]->name) == 0) {
531 ts[nummodels]->
SetMainColorRGB(material[i]->color[0], material[i]->color[1], material[i]->color[2]);
539void view3ds(
const char *fname =
"nasashuttle.3ds")
546 for (i = 0; i < 2048; i++)
548 for (i = 0; i < 1024; i++)
553 if (Read3DSFile(fname) == 0) {
556 gEve->AddElement(parent);
557 for (i = 0; i < nummodels; i++) {
566 for (i = 0; i < nummaterials; i++)
567 if (material[i] != 0)
unsigned short UShort_t
Unsigned Short integer 2 bytes (unsigned short).
int Int_t
Signed integer 4 bytes (int).
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
float Float_t
Float 4 bytes (float).
virtual void AddElement(TEveElement *el)
Add el to the list of children.
virtual void SetMainTransparency(Char_t t)
Set main-transparency.
virtual TEveTrans & RefMainTrans()
Return reference to main transformation.
virtual void SetMainColor(Color_t color)
Set main color of the element.
void SetMainColorRGB(UChar_t r, UChar_t g, UChar_t b)
Convert RGB values to Color_t and call SetMainColor.
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
void RotateLF(Int_t i1, Int_t i2, Double_t amount)
Rotate in local frame. Does optimised version of MultRight.
Made from a list of vertices and a list of triangles (triplets of vertex indices).
void SetTriangle(Int_t i, Int_t v0, Int_t v1, Int_t v2)
void SetVertex(Int_t i, Float_t x, Float_t y, Float_t z)
void GenerateTriangleNormals()
Generate triangle normals via cross product of triangle edges.
virtual void SetName(const char *name)
Set the name of the TNamed.
void Vertex(const Double_t *v)