3ds Loader, help to resize arrays needed
BlitzMax Forums/BlitzMax Programming/3ds Loader, help to resize arrays needed
| ||
I have this code and i can t use multi dimensionnal arrays beacause there s an error during the compilation who say "Incorrect Number of array dimension"...'Strict load3ds ("obj/mesh.3ds") Type object3ds Field vertex:Float[][] Field polygon:Int[][] Field mapCoord:Float[][] Method resizeVertex(quantity) vertex=vertex[..2] For Local l=0 To 2 vertex[l]=vertex[l][..quantity] Next End Method Method resizepolygon(quantity) polygon=polygon[..2] For Local l=0 To 2 polygon[l]=[l][..quantity] Next End Method Method resizemapCoord(quantity) mapCoord=mapCoord[..1] For Local l=0 To 1 mapCoord[l]=mapCoord[l][..quantity] Next End Method End Type '--------------------------------------------------------- Function load3ds (path:String) '--------------------------------------------------------- Local file=OpenFile(path) If file=0 Then Return 0 o:object3ds=New object3ds Local chunk_id:String,chunk_length:String,quantity:Short Local b:Byte '----------------------------------------------------------- While Not Eof(file) chunk_id:String=Hex(ReadShort(file)) chunk_length:String=Hex(Readint(file)) 'DebugLog chunk_id 'DebugLog chunk_length Select chunk_id Case "00004D4D"'no data Case "00003D3D"'no data Case "00004000"'object's name While b<>0 b=ReadByte(file) name:String=name+Chr(b) Wend Case "00004100"'empty too Case "00004110"'list od the vertices quantity=ReadShort(file) DebugLog "N vertices= "+quantity o.resizevertex(quantity) For l=1 To quantity For l2=0 To 2 o.vertex[l2,l]=ReadShort(file) Next Next Case "00004120"'faces description quantity=ReadShort(file) DebugLog "N Faces= "+quantity o:object3ds=New object3ds o.resizepolygon(quantity) For l=1 To quantity For l2=0 To 2 o.polygon[l2,l]=ReadShort(file) Next face_flag=ReadShort(file) Next Case "00004140"'coordinates list quantity=ReadShort(file) DebugLog "N Coordinates= "+quantity o.resizemapCoord(quantity) For l=1 To quantity For l2=0 To 1 o.mapCoord[l2,l]=ReadFloat(file) Next Next Default DebugLog "Default Case" For l=1 To 6 ReadByte (file) Next End Select Wend cloasefile(file) End Function '--------------------------------------------------------- thanks. |
| ||
Hmm cool, I have worked yet on an 3ds viewer to code further a 3DS importer for my 3d engine. Here the 3DS viever for BlitzBasic. (bad code I know!) If its help: Global Stream, Chunk, Size, Number, Name$, Char Stream = ReadFile("mickey.3ds") While Not Eof(Stream) Chunk = ReadShort(Stream) Size = ReadInt(Stream) Select Chunk Case $4D4D: DebugLog "MAIN" Case $3D3D DebugLog " 3D Editor" Case $4000 DebugLog " Object Block" Name$ = "" While Not Eof(Stream) Char = ReadByte(Stream) If Char = 0 Then Exit Name$ = Name$+Chr(Char) Wend DebugLog " Name: "+Name$ Case $4100 DebugLog " Triangular Object" Case $4110 DebugLog " Vertex List" Number = ReadShort(Stream) DebugLog " Number Of Vertices: "+Number For I = 1 To Number DebugLog " "+ReadFloat(Stream)+", "+ReadFloat(Stream)+", "+ReadFloat(Stream) Next Case $4120 DebugLog " Face List" Number = ReadShort(Stream) DebugLog " Number Of Faces: "+Number For I = 1 To Number DebugLog " "+ReadShort(Stream)+", "+ReadShort(Stream)+", "+ReadShort(Stream) Next ReadShort(Stream) Case $4130 DebugLog " Faces material List" Name$ = "" While Not Eof(Stream) Char = ReadByte(Stream) If Char = 0 Then Exit Name$ = Name$+Chr(Char) Wend DebugLog " Name: "+Name$ DebugLog " Number of entries: "+ReadShort(Stream) For I = 1 To Number DebugLog " "+ReadShort(Stream) Next Case $4140 DebugLog " Mapping coordinates list for each vertex" Number = ReadShort(Stream) DebugLog " Number Of Vertices: "+Number For I = 1 To Number DebugLog " "+ReadFloat(Stream)+", "+ReadFloat(Stream) Next Case $AFFF DebugLog " Material block" Case $A000 DebugLog " Material Name" Name$ = "" While Not Eof(Stream) Char = ReadByte(Stream) If Char = 0 Then Exit Name$ = Name$+Chr(Char) Wend DebugLog " Name: "+Name$ Case $A200 DebugLog " Map" Case $A300 DebugLog " Map Filename" Name$ = "" While Not Eof(Stream) Char = ReadByte(Stream) If Char = 0 Then Exit Name$ = Name$+Chr(Char) Wend DebugLog " Filename: "+Name$ Case $A354 DebugLog " V Scale" DebugLog " Scale: "+ReadFloat(Stream) Case $A356 DebugLog " U Scale" DebugLog " Scale: "+ReadFloat(Stream) Case $A358 DebugLog " U Offset" DebugLog " Offset: "+ReadFloat(Stream) Case $A35A DebugLog " V Offset" DebugLog " Offset: "+ReadFloat(Stream) Case $A35A DebugLog " Rotation angle" DebugLog " Angle: "+ReadFloat(Stream) Default SeekFile Stream, FilePos(Stream)+Size-6 End Select Wend CloseFile Stream Just use Banks! It is better for handling in the 3d engine, becouse you can update for example VBOs faster. mfg olli Edit: One question: Have the 3ds format information about vertexnormals? |
| ||
When i ll get it i will repost... :) I tried with arrays idependant of the types and it s working, now i need to copy them |
| ||
i've found another way but i have an error, i can t read the face description [CODE] Strict Global ScreenW=800 Global ScreenH=600 init() '******************************************************************************************************************************** '* Moteur 3d en BlitzMax et Raw OpenGl * '* interprete par Skurcey (tiré de http://www.spacesimulator.net/tut1_3dengine_fre.html ) * '******************************************************************************************************************************* Type vertex Field id:Int,x:Float,y:Float,z:Float Method constructor(n:Int,vx:Float,vy:Float,vz:Float) id=n;x=vx;y=vy;z=vz End Method End Type Type polygon Field id,a,b,c Method constructor(n:Int,v1:Float,v2:Float,v3:Float) id=n;a=v1;b=v2;c=v3 End Method End Type Type mapCoord Field id,u:Float,v:Float Method constructor(n:Int,mu:Float,mv:Float) id=n;u=mu;v=mv End Method End Type Type obj Field n_v,n_p Field max_vertices,max_polygons Field v:vertex[0] Field p:polygon[0] Field m:mapCoord[0] Field name:String Method newvertex(vx,vy,vz) v[n_v]=New vertex v[n_v].constructor(n_v,vx,vy,vz) n_v:+1 End Method Method newpoly(id1,id2,id3) p[n_p]=New polygon p[n_p].constructor(n_p,id1,id2,id3) n_p:+1 End Method Method newmapCoord(id,u,v) DebugLog id m[id]=New mapCoord m[id].constructor(id,u,v) End Method Method draw() Local l:Int glBegin GL_TRIANGLES For l=0 To n_p-1 glVertex3f v[p[l].a].x,v[p[l].a].y,v[p[l].a].z glVertex3f v[p[l].b].x,v[p[l].b].y,v[p[l].b].z glVertex3f v[p[l].c].x,v[p[l].c].y,v[p[l].c].z Next glEnd End Method Method load3ds(path:String) Local file=ReadFile(path) Local size=FileSize(path) DebugLog "Sizez :"+size Local chunk_id:String Local chunk_length Local l,tmp Local b:Byte If file=0 Then Return 0 DebugLog "Has open "+path While Not Eof(file) chunk_id=Hex(ReadShort(file)) chunk_length=convertToInt(Hex(Readint(file))) 'DebugLog chunk_id Select chunk_id Case "00004d4d" Case "00003d3d" Case "00004000" 'name of the object For l=0 To 20 b=ReadByte(file) If b=0 Then Exit name:+Chr(b) Next DebugLog "Name: "+name Case "00004100" Case "00004110" 'vertices list+ quantity max_vertices=ReadShort(file) DebugLog "Vertices :"+Max_vertices resizevertices() For l=0 To max_vertices-1 newvertex(ReadFloat(file),ReadFloat(file),ReadFloat(file)) Next Case "00004120" 'quantity + list of poly max_polygons=ReadShort(file) DebugLog "Polygons: "+Max_polygons resizepolygons() For l=0 To max_polygons-1 newpoly(ReadShort(file),ReadShort(file),ReadShort(file)) Next Case "00004140"'quantity + map coordinates max_polygons=ReadShort(file) DebugLog "Map Coord: "+max_polygons resizeMapCoord(max_polygons) For l=0 To max_polygons-1 newMapCoord(l,ReadFloat(file),ReadFloat(file)) Next Default tmp=SeekStream (file,StreamPos(file)+chunk_length-1) If tmp=-1 Or (StreamPos(file)+chunk_length)>=size-1 Then Exit DebugLog StreamPos(file)+chunk_length 'For l= 1 To tmp ' ReadByte file 'Next End Select Wend CloseFile file DebugLog path +" is now close" End Method Method convertToInt(s$) Local m:String,l,resultat For Local l=1 To Len(s) m$=Mid$(s,l,1) If m>=0 Or m<=9 resultat:+Int(m) ElseIf m="a" resultat:+11 ElseIf m="b" resultat:+12 ElseIf m="c" resultat:+13 ElseIf m="d" resultat:+14 ElseIf m="e" resultat:+15 ElseIf m="f" resultat:+16 EndIf Next Return resultat End Method Method resizeMapCoord(newSize) m=m[..newSize] End Method Method resizeVertices() v=v[..max_vertices] End Method Method resizePolygons() p=p[..max_polygons] End Method End Type Function init() bglCreateContext ScreenW,ScreenH glMatrixMode GL_PROJECTION 'permet de fixer la position et lorientation de la camera glLoadIdentity() 'initialise ou reinitialise la matrice dans les operations courantes glFrustum -0.1, 0.1,-0.1, 0.1, 0.1, 10000.0 'transformation de la perspective et affichage des points contenu entre les 2 dernieres variables ' gauche,droite,bas,haut, visionMin, visionMax glMatrixMode GL_MODELVIEW 'objet qui composent la scene(id,orientation,position) + camera glLoadIdentity() End Function Global wireframe Function key() If KeyHit(KEY_F1) If wireframe=0 wireframe=1 glPolygonMode (GL_FRONT_AND_BACK,GL_POINT ) 'dessinne les poly comme des points 'le 1er parametre peut etre GL_FRONT ou GL_BACK aussi ElseIf wireframe=1 wireframe=2 glPolygonMode (GL_FRONT_AND_BACK,GL_LINE ) 'comme des ligne (wireframe) ElseIf wireframe=2 wireframe=0 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL ) 'dessinne les poly remplits EndIf EndIf End Function '---------------------------------------------------------------------------------------------------------------------------------- Local o:obj=New obj o.load3ds("geosphere.3ds") While Not KeyHit(KEY_ESCAPE) glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT 'nettoye les buffer(tampon) de couleur et de profondeur glLoadIdentity gluLookAt(0,0,-100, 0,0,5, 0, 1, 0); o.draw() bglSwapBuffers Wend [/CODE] |