lightwave file format
Anyone have experience with the lwo file format? I can find and use the vetices data in the file but I can''t seem to find u and v co-ords for images/textures. Can anyone explain. I''m using LW 5.6
http://www.wotsit.org/search.asp?page=25&s=ALLFILES
http://www.wotsit.org/search.asp?page=26&s=ALLFILES
Bottom of first link and top of second link.
--
Simon O''''Connor
Creative Asylum Ltd
www.creative-asylum.com
http://www.wotsit.org/search.asp?page=26&s=ALLFILES
Bottom of first link and top of second link.
--
Simon O''''Connor
Creative Asylum Ltd
www.creative-asylum.com
Thanks for the reply. I was looking at these docs a couple of days ago, and the best I seem to find here is:
Location and Size
TSIZ, TCTR, TFAL, TVEL { vector[VEC12] }
These sub-chunks each consist of a vector for the current texture''s size, center, falloff, or velocity. If missing, the center, falloff and velocity are assumed to be zero. The size should always be specified for any texture.
It seems like the center of the texture might be what I looking for, but I don''t know how this relates to u and v, which is what I''m familiar with. Any suggestions.
Do other 3D apps use the u and v or is the above standard fare?
Location and Size
TSIZ, TCTR, TFAL, TVEL { vector[VEC12] }
These sub-chunks each consist of a vector for the current texture''s size, center, falloff, or velocity. If missing, the center, falloff and velocity are assumed to be zero. The size should always be specified for any texture.
It seems like the center of the texture might be what I looking for, but I don''t know how this relates to u and v, which is what I''m familiar with. Any suggestions.
Do other 3D apps use the u and v or is the above standard fare?
So let me clarify, LW 6.0 and after stores u and v for each vertex whereas pre 6.0 uses some algorithm based on the center or velocity/falloff and size of a texture?
It seems like it might be difficult to calculate the u and v based on the available data in the .lwo
Does Milkshape store u and v per vertex?
It seems like it might be difficult to calculate the u and v based on the available data in the .lwo
Does Milkshape store u and v per vertex?
heres my code for loading lightwave objects into my model structure
I spent 10 hours programming this, so I'll expect a check for 165$ in the mail in a couple days.
Edited by - Xanthen on January 12, 2002 2:46:43 PM
const int TAG_VMAP = 1447903568;const int TAG_PTAG = 1347699015;const int TAG_VMAD = 1447903556;const int TAG_CLIP = 1129072976;const int TAG_BLOK = 1112297291;const int TAG_IMAG = 1229799751;const int TAG_SURF = 1398100550;const int TAG_FLAG = 1179402567;const int TAG_TAGS = 1413564243;const int TAG_LAYR = 1279351122;const int TAG_PNTS = 1347310675;const int TAG_BBOX = 1111641944;const int TAG_TXUV = 1415075158;int fvalue;float * fpointer;fpointer=(float *)&fvalue//int TriTexOffsetIndices[NUMTRIANGLES][3];MyString text;fseek(F1,0,SEEK_SET);if (getrw(F1)==1179603533)//FORM{ MyString Tags[50]; int ChunkSize=getrw(F1); int FormType=getrw(F1); int NumSurf; long TagLength; if (getrw(F1)!=TAG_TAGS) { Error=1; return(0); } TagLength = getrw(F1); NumSurf=0; while (ftell(F1) < TagLength + 20) getString(F1,&Tags[NumSurf++]); if (getrw(F1)!=TAG_LAYR) { Error=1; return(0); } fseek(F1,getrw(F1),SEEK_CUR); if (getrw(F1)!=TAG_PNTS) { Error=1; return(0); } Model->NumVert = getrw(F1)/12; Model->NumFrame = 1; Model->AllocateMemory(); Model->FrameNumbers[0][0]=0; for(x=0;x<Model->NumVert;x++) { fvalue = getrw(F1); Model->Vert[x].FrameV[0].x=*fpointer; fvalue = getrw(F1); Model->Vert[x].FrameV[0].z=*fpointer; fvalue = getrw(F1); Model->Vert[x].FrameV[0].y=*fpointer; } if (getrw(F1)!=TAG_BBOX) { Error=1; //Word BBOX return(0); } fseek(F1,getrw(F1),SEEK_CUR); long VMAPPos[5]; long VMADPos[5]; int VMAPCnt; int VMADCnt; VMAPCnt=0; while (getrw(F1)==TAG_VMAP) { VMAPPos[VMAPCnt++] = ftell(F1); fseek(F1,getrw(F1),SEEK_CUR); } fseek(F1,-4,SEEK_CUR); getrw(F1); //WORD POLS int PolSize = getrw(F1); int TriProp; getrw(F1); //WORD FACE Model->NumTri = (PolSize-4)/8; Model->AllocateMemory(); for (x=0;x<Model->NumTri;x++) { TriProp = (getc(F1) << 8) + getc(F1); Model->Tri[x].Tri[0] = (getc(F1) << 8) + getc(F1); Model->Tri[x].Tri[1] = (getc(F1) << 8) + getc(F1); Model->Tri[x].Tri[2] = (getc(F1) << 8) + getc(F1); } long PolyTag; if (getrw(F1)!=TAG_PTAG) { Error=1; return(0); } PolyTag = ftell(F1) + 4; fseek(F1,getrw(F1),SEEK_CUR); // long ptagend = getrw(F1)+ftell(F1);// getrw(F1); //WORD SURF VMADCnt=0; while (getrw(F1)==TAG_VMAD) { VMADPos[VMADCnt++] = ftell(F1); fseek(F1,getrw(F1),SEEK_CUR); } fseek(F1,-4,SEEK_CUR); int TextureNum; int TextureIndex[5]; while (getrw(F1)==TAG_CLIP) { getrw(F1); //Length of Clip chunk TextureNum = getrw(F1); getrw(F1); //STIL getc(F1); getc(F1); getString(F1,&Model->TexturePath[TextureNum-1]); TextureIndex[TextureNum-1] = TexH.GenerateTexture(Model->TexturePath[TextureNum-1],"",0); } fseek(F1,-4,SEEK_CUR); while (getrw(F1)==TAG_FLAG) { fseek(F1,(getc(F1) << 8) + getc(F1),SEEK_CUR); } fseek(F1,-4,SEEK_CUR); long NextSurf; MyString SurfName; MyString SourceName; int SurfTex; int SurfID; int lVert; int y,z; float uval,vval; int VMAPSize; int VMADSize; int TriNum; int PntNum; int n; int lTri; int TagIndex; MyString VMAPTex; while (getrw(F1)==TAG_SURF) { NextSurf = getrw(F1) + ftell(F1); getString(F1,&SurfName); getString(F1,&SourceName); while ((getrw(F1)!=TAG_BLOK) && (ftell(F1)<NextSurf)) { fseek(F1,(getc(F1) << 8) + getc(F1),SEEK_CUR); } if (ftell(F1)<NextSurf) { getc(F1); //Move past Blok Length bytes getc(F1); while (getrw(F1)!=TAG_IMAG) { fseek(F1,(getc(F1) << 8) + getc(F1),SEEK_CUR); } getc(F1); getc(F1); SurfID = (getc(F1) << 8) + getc(F1); SurfTex = TextureIndex[SurfID-1]; for (x=0;x<NumSurf;x++) if (SurfName==Tags[x]) break; TagIndex = x; fseek(F1,PolyTag,SEEK_SET); getrw(F1); for (x=0;x<Model->NumTri;x++) { lTri = (getc(F1) << 8) + getc(F1); if (TagIndex==((getc(F1) << 8) + getc(F1))) { Model->Tri[lTri].TriTexturePointer = SurfTex; } }// for (n=0;n<VMAPCnt;n++) { fseek(F1,VMAPPos[SurfID-1],SEEK_SET); VMAPSize = getrw(F1); //VMAP SIZE getrw(F1); //Word TXUV int TextureLen = (getc(F1) << 8) + getc(F1); //Equals 2 getString(F1,&VMAPTex); VMAPSize-=(ftell(F1) - VMAPPos[SurfID-1]+4); VMAPSize/=10; for (x=0;x<VMAPSize;x++) { lVert = (getc(F1) << 8) + getc(F1); fvalue = getrw(F1); uval=*fpointer; fvalue = getrw(F1); vval=*fpointer; for (y=0;y<Model->NumTri;y++) if (Model->Tri[y].TriTexturePointer==SurfTex) for (z=0;z<3;z++) if (Model->Tri[y].Tri[z]==lVert) { Model->Tri[y].TriTexVerts[z][0] = uval; Model->Tri[y].TriTexVerts[z][1] = vval; } } } } fseek(F1,NextSurf,SEEK_SET); } for (n=0;n<VMADCnt;n++) { fseek(F1,VMADPos[n],SEEK_SET); VMADSize = getrw(F1); //VMAP SIZE getrw(F1); //Word TXUV int TextureLen = (getc(F1) << 8) + getc(F1); //Equals 2 getString(F1,&Model->TexturePath[0]); VMADSize-=(ftell(F1) - VMADPos[n]+4); VMADSize/=12; for (x=0;x<VMADSize;x++) { PntNum = (getc(F1) << 8) + getc(F1); TriNum = (getc(F1) << 8) + getc(F1); for (y=0;y<3;y++) { if (Model->Tri[TriNum].Tri[y]==PntNum) { fvalue = getrw(F1); Model->Tri[TriNum].TriTexVerts[y][0] = *fpointer; fvalue = getrw(F1); Model->Tri[TriNum].TriTexVerts[y][1] = *fpointer; break; } } if (y==3) { getrw(F1); getrw(F1); } } }}fclose(F1);return(1);//Two functions i createdint getrw(FILE * F1){ unsigned int w; w = (getc(F1) << 24) + (getc(F1) << 16) + (getc(F1) << 8) + getc(F1); return(w);}void getString(FILE * F1, MyString * name){ int x; int cnt; unsigned char lname[80]; cnt=0; while (x=getc(F1)) { lname[cnt]=x; cnt++; } lname[cnt]=0; *name=lname; if (((float)cnt/2) == (int)(cnt/2)) getc(F1);}
I spent 10 hours programming this, so I'll expect a check for 165$ in the mail in a couple days.
Edited by - Xanthen on January 12, 2002 2:46:43 PM
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement