I've haad a quick look around the site but can't find any - does anyone have any OBJ importing code?
OBJ importer?
Blitz3D Forums/Blitz3D Programming/OBJ importer? All I can offer you is a commandline tool that is capable of converting some formats, including OBJ to 3DS. Includes C Sourcecode, so you may port it to Blitz, or use the binary by the commandline in a hidden mode:
http://www.melog.ch/dl/ivcon_3dconvert_win32bin.zip
http://www.melog.ch/dl/ivcon_3dconvert_win32bin.zip
Thanks jfk, but I've been asked the dreaded question 'How difficult would it be...' (- Don't you just hate that from non-programmers.)
So I guess it would have to be Blitz3D code - possibly a routine that would internally build a mesh from a .Obj file?
Anyone?
So I guess it would have to be Blitz3D code - possibly a routine that would internally build a mesh from a .Obj file?
Anyone?
I've got some at home (Posting from work), I'll dig it out when I get back.
Thanks Lee, that would be much appreciated.
I'll look forward to it.
I'll look forward to it.
Sorry it took so long. A Simple function which returns a mesh, as pulled from Tattoo. :)
This one handles scientific notation in the text of the .OBJ file. Caught me out that one!
Function LoadObj(file$) Local infile, intex$, cmd$, themesh, blanksurf, ek, its Local P1$, P2$, P3$, P4$, vtx1#, vtx2#, vtx3#, vtx4# Local tx1#, tx2#, tx3#, tx4#, retmesh, v, uvo If FileType(file$)=0 Then Return -1 infile = ReadFile(file$) themesh = CreateMesh() tempvert = CreateMesh() retmesh = CreateMesh() TempVertSurf = CreateSurface(tempvert) blanksurf = CreateSurface(themesh) While Not Eof(infile) intex$ = ReadLine$(infile) cmd$ = ParseEntry(intex$,0) its = CountIt(intex$," ") If its>1 Then P1$ = ParseEntry(Intex$,1) Else p1$="" If its>2 Then P2$ = ParseEntry(Intex$,2) Else p2$="" If its>3 Then P3$ = ParseEntry(Intex$,3) Else p3$="" If its>4 Then P4$ = ParseEntry(Intex$,4) Else p4$="" ;DebugLog "Command: "+cmd$+" P1: "+p1$+" P2: "+p2$+" P3: "+p3$+" P4: "+p4$ Select cmd$ Case "V" AddVertex blanksurf,Float(P1$),Float(P2$),Float(P3$)*-1 Case "VT" AddVertex TempVertSurf,Rand(10),Rand(10),Rand(10) VertexTexCoords TempVertSurf,vtx,Float(P1$),1-Float(P2$) ;DebugLog "P1$="+p1$+" P2$= "+p2$ ;DebugLog "U = "+P1$+" V = "+P2$ vtx = vtx + 1 Case "USEMTL" DebugLog "Hoot "+P1$ currentsurf = CreateSurface(retmesh) If Trim$(P1$)<>"" Then If Instr(p1$,".")<>0 And FileType(modelpath$+p1$)<>0 Then sometex = LoadTexture(modelpath$+p1$,1+VRAM) : Goto passway If FileType(modelpath$+p1$+".PNG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM) : Goto passway If FileType(modelpath$+p1$+".BMP")<>0 Then sometex = LoadTexture(modelpath$+p1$+".BMP",1+VRAM) : Goto passway If FileType(modelpath$+p1$+".TGA")<>0 Then sometex = LoadTexture(modelpath$+p1$+".TGA",1+VRAM) : Goto passway If FileType(modelpath$+p1$+".JPG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".JPG",1+VRAM) : Goto passway sometex = CreateTexture(512,512,1+VRAM) SetBuffer TextureBuffer(sometex) ClsColor 128,128,128 Cls SetBuffer BackBuffer() savetex(p1$+".PNG",sometex) FreeTexture sometex sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM) .passway If sometex<>0 Then somebrush = CreateBrush(255,255,255) BrushTexture somebrush,sometex PaintSurface currentsurf,somebrush EndIf EndIf Case "F" If currentsurf = 0 Then currentsurf = CreateSurface(retmesh) sometex = CreateTexture(512,512,1+VRAM) SetBuffer TextureBuffer(sometex) ClsColor 128,128,128 Cls SetBuffer BackBuffer() somebrush = CreateBrush(255,255,255) BrushTexture somebrush,sometex PaintSurface currentsurf,somebrush EndIf Vtx1# = -65535 : TX1# = -65535 Vtx2# = -65535 : TX2# = -65535 Vtx3# = -65535 : TX3# = -65535 Vtx4# = -65535 : TX4# = -65535 If its>1 Then ug = CountIT(P1$,"/") If ug>0 Then Vtx1#=Float(ParseEntry(p1$,0,"/"))-1 EndIf If ug>1 Then tx1# = Float(ParseEntry(p1$,1,"/"))-1 EndIf EndIf If its>2 Then ug = CountIT(P2$,"/") If ug>0 Then Vtx2#=Float(ParseEntry(p2$,0,"/"))-1 EndIf If ug>1 Then tx2# = Float(ParseEntry(p2$,1,"/"))-1 EndIf EndIf If its>3 Then ug = CountIT(P3$,"/") If ug>0 Then Vtx3#=Float(ParseEntry(p3$,0,"/"))-1 EndIf If ug>1 Then tx3# = Float(ParseEntry(p3$,1,"/"))-1 EndIf EndIf If its>4 Then ug = CountIT(P4$,"/") If ug>0 Then Vtx4#=Float(ParseEntry(p4$,0,"/"))-1 EndIf If ug>1 Then tx4# = Float(ParseEntry(p4$,1,"/"))-1 EndIf EndIf If vtx1<0 Then vtx1 = 0 If vtx2<0 Then vtx2 = 0 If vtx3<0 Then vtx3 = 0 If vtx4<0 Then vtx4 = 0 If vtx1>CountVertices(blanksurf)-1 Then vtx1 = CountVertices(blanksurf)-1 If vtx2>CountVertices(blanksurf)-1 Then vtx2 = CountVertices(blanksurf)-1 If vtx3>CountVertices(blanksurf)-1 Then vtx3 = CountVertices(blanksurf)-1 If vtx4>CountVertices(blanksurf)-1 Then vtx4 = CountVertices(blanksurf)-1 If tx1>CountVertices(tempvertsurf)-1 Then tx1 = CountVertices(tempvertsurf)-1 If tx2>CountVertices(tempvertsurf)-1 Then tx2 = CountVertices(tempvertsurf)-1 If tx3>CountVertices(tempvertsurf)-1 Then tx3 = CountVertices(tempvertsurf)-1 If tx4>CountVertices(tempvertsurf)-1 Then tx4 = CountVertices(tempvertsurf)-1 v = CountVertices(currentsurf) If its>1 Then If tx1<0 Then tx1 = tx1 + vtx+1 UVO = TX1 If CountVertices(TempVertSurf)=0 Then AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1) Else AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO) EndIf EndIf If its>2 Then If tx2<0 Then tx2 = tx2 + vtx+1 UVO = TX2 ;DebugLog "TX2= "+tx2 If CountVertices(TempVertSurf)=0 Then AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2) Else AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO) EndIf EndIf If its>3 Then If tx3<0 Then tx3 = tx3 + vtx+1 UVO = TX3 ;DebugLog "TX3= "+tx3 If CountVertices(TempVertSurf)=0 Then AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3) Else AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO) EndIf EndIf If its>4 Then If tx4<0 Then tx4 = tx4 + vtx+1 UVO = TX4 If CountVertices(TempVertSurf)=0 Then AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4) Else AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO) EndIf EndIf AddTriangle currentsurf,v,v+1,v+2 If its>4 Then AddTriangle currentsurf,v+2,v+3,v EndIf End Select Wend CloseFile infile FitMesh retmesh,0,0,0,1,1,1,True FlipMesh retmesh centermesh (retmesh) UpdateNormals retmesh FreeEntity tempvert FreeEntity themesh Return retmesh End Function Function ParseEntry$( Message$, Item, Sep$ = " ") Local fas, count, spos, epos, num#, epon#,pos Repeat fas = Instr(message$,sep$,fas+1) count = count + 1 Until fas = 0 Or count = item spos = fas+1 epos = Instr(message$+sep$,sep$,fas+1) grub$ = Upper$(Trim$(Mid$(message$,spos,(epos-spos)))) If Instr(grub$,"E-") Then pos = Instr(grub$,"E-") ;1.41e-02 = 1.41 * (10 ^ -2) num# = Left$(grub$,pos-1) epon# = Mid$(grub$,pos+1,Len(grub$)-(pos)) ;'DebugLog "Total: "+grub$ ;'DebugLog "Num: "+num# ;'DebugLog "etex: "+Mid$(grub$,pos+1,Len(grub$)-(pos)) ;'DebugLog "Exp: "+epon# num# = num# * (10 ^ epon#) Return num# Return "0.0" Else Return grub$ EndIf End Function Function CountIt( Message$, Sep$=" ") message$=Trim$(message$) Local fas, count Repeat fas = Instr(message$,sep$,fas+1) If fas<>0 Then count = count + 1 Until fas = 0 Return count+1 End Function Function CenterMesh (entity) FitMesh entity, -(MeshWidth (entity) / 2), -(MeshHeight (entity) / 2), -(MeshDepth (entity) / 2), MeshWidth (entity), MeshHeight (entity), MeshDepth (entity) End Function
This one handles scientific notation in the text of the .OBJ file. Caught me out that one!
Cool !!!! Great!!
Is a function savetex() missing ?
/Alienforce
Is a function savetex() missing ?
/Alienforce
Yep, SaveTex is Tattoo specific. Basicly it saves out a texture in preparation to painting it.
Normally you wouldn't need it. Just load the textures that are there.
Normally you wouldn't need it. Just load the textures that are there.
Ok, thanks alot for sharing this.
/Alienforce
/Alienforce
Can I copy it to the Archives?
Can I copy it to the Archives?
Sure. Why not.
Lee, at the risk of sounding petty (since you've done so much work on this) I'm afraid that I have not succesfully loaded a single obj file.
Three obj files gave a 'Vertex index out of bounds' error, and the four that did load appeared to have lost their textures.
Fancy doing a little more work on this?
(Pretty please.... I can zip up the meshes and send them to you if you like?)
Three obj files gave a 'Vertex index out of bounds' error, and the four that did load appeared to have lost their textures.
Fancy doing a little more work on this?
(Pretty please.... I can zip up the meshes and send them to you if you like?)
The .OBJ file format doesn't appear to use textures the same way as Blitz. It uses material files.
If you send them over I'll take a look. But you should have enough there to get the textures showing without much effort.
If you send them over I'll take a look. But you should have enough there to get the textures showing without much effort.
Lee, rather than ask you to do any more work, can I ask you a few questions?
I'm trying to satisfy a client who wants to import OBJ files.
What I have just noticed is that none of the editors that I use export a .obj with textures specs!
I've looked at all the .obj files I have in Notepad, and none of them have internal texture specifications.
Does this mean that the .obj file format does not include textures?
The client's main gripe was that .3DS meshes have a face limit which might be too low for them. Do you know the face limit of a .3DS file?
I'm trying to satisfy a client who wants to import OBJ files.
What I have just noticed is that none of the editors that I use export a .obj with textures specs!
I've looked at all the .obj files I have in Notepad, and none of them have internal texture specifications.
Does this mean that the .obj file format does not include textures?
The client's main gripe was that .3DS meshes have a face limit which might be too low for them. Do you know the face limit of a .3DS file?
I guess its a 64k thing - as usual. But AFAIK it's DirectX that has such a limit and therefor cannot be used for larger meshes (well I think it was max 64k Vertices and Tris each Surface)
The texture refs are to Materials. These appear to be external files (.MTL I think). These would likely have surface information in them including any bitmaps.
I don't know what the face limit on a .3DS is, but if you have any 3D Packages that export .3DS keep subdividing a sphere until it complains, then you'll know.
.3DS is limited in other way as far as I know. Things like 8.4 Filenames etc.
I suppose the question is, where are the models coming from and what formats can it output?
I don't know what the face limit on a .3DS is, but if you have any 3D Packages that export .3DS keep subdividing a sphere until it complains, then you'll know.
.3DS is limited in other way as far as I know. Things like 8.4 Filenames etc.
I suppose the question is, where are the models coming from and what formats can it output?
I think we've narrowed this down to the following:
1) The guy uses 'SketchUp' - an architect/designer's favourite (about £230?) - said designers like .obj because they've decided it 'outputs more accurately'.
2) They are interested in the possibility of a B3D-based 'viewer' prog since they're not happy with what they have.
3) As you say .obj's use .mtl files which describe the textures.
5) Interestingly I have no 3D modeller which acknowledges or outputs .mtl files, but obviously the designers do, so I've asked him to send me a textured cube so I can look at the file structure and the mtl file.
Don't suppose you'd be interested in adding .mtl capability to your code?
1) The guy uses 'SketchUp' - an architect/designer's favourite (about £230?) - said designers like .obj because they've decided it 'outputs more accurately'.
2) They are interested in the possibility of a B3D-based 'viewer' prog since they're not happy with what they have.
3) As you say .obj's use .mtl files which describe the textures.
5) Interestingly I have no 3D modeller which acknowledges or outputs .mtl files, but obviously the designers do, so I've asked him to send me a textured cube so I can look at the file structure and the mtl file.
Don't suppose you'd be interested in adding .mtl capability to your code?
This is a textured cube in .obj file format, which is as you can see, from Gile[s].
If I were you, I would go for Gile[s]. It can import/export .obj with materials and has the capability to bake lightmaps which makes architectural walk-throughs much prettier. Esp. Gile[s] can save to .b3d. This leaves you with writing a viewer for .b3d which is fairly straight forward.
If I were you, I would go for Gile[s]. It can import/export .obj with materials and has the capability to bake lightmaps which makes architectural walk-throughs much prettier. Esp. Gile[s] can save to .b3d. This leaves you with writing a viewer for .b3d which is fairly straight forward.
# cobe.obj # Exported by gile[s] mtllib cube.mtl o Scene #Begin Vertices v 1.000000 1.000000 -1.000000 v -1.000000 1.000000 -1.000000 v -1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 1.000000 1.000000 v 1.000000 1.000000 1.000000 v 1.000000 1.000000 -1.000000 v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v 1.000000 1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v -1.000000 1.000000 -1.000000 v 1.000000 -1.000000 -1.000000 v -1.000000 -1.000000 -1.000000 v -1.000000 -1.000000 1.000000 v 1.000000 -1.000000 1.000000 v 1.000000 1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 v 1.000000 1.000000 -1.000000 #End Vertices #Begin Vertex Normals vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 #End Vertex Normals #Begin Vertex Texture Coords vt 0.000000 1.000000 0.000000 vt 1.000000 1.000000 0.000000 vt 1.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt -1.000000 0.000000 0.000000 vt -1.000000 1.000000 0.000000 vt 0.000000 1.000000 0.000000 vt 0.000000 1.000000 0.000000 vt 1.000000 1.000000 0.000000 vt 1.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt -1.000000 0.000000 0.000000 vt -1.000000 1.000000 0.000000 vt 0.000000 1.000000 0.000000 vt 0.000000 1.000000 0.000000 vt 1.000000 1.000000 0.000000 vt 1.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt 0.000000 0.000000 0.000000 vt -1.000000 0.000000 0.000000 vt -1.000000 1.000000 0.000000 vt 0.000000 1.000000 0.000000 #End Vertex Texture Coords #Begin Polygons g usemtl tex f 1/1/1 3/3/3 2/2/2 f 1/1/1 4/4/4 3/3/3 f 5/5/5 7/7/7 6/6/6 f 5/5/5 8/8/8 7/7/7 f 9/9/9 11/11/11 10/10/10 f 9/9/9 12/12/12 11/11/11 f 13/13/13 15/15/15 14/14/14 f 13/13/13 16/16/16 15/15/15 f 17/17/17 19/19/19 18/18/18 f 17/17/17 20/20/20 19/19/19 f 21/21/21 23/23/23 22/22/22 f 21/21/21 24/24/24 23/23/23 #End PolygonsAnd the material file:
# cube.mtl newmtl tex Ka 1 1 1 Kd 1.000000 1.000000 1.000000 Ks 0.000000 0.000000 0.000000 map_Kd tex.png
I think you've hit on it, Dirk.
So the simple answer is to tell these people to buy Giles as part of their pipeline.
Then they still have a choice (I assume) to export finaly as .3DS, .X, .B3D for use in a viewer.
Unless Lee fancies do some more work on his code.
(Lee growls quietly.)
Which would make me look very good, and of course Lee would be included in the credits.
Sorry, did you say 'Money'?
You know, I have this reoccuring problem with my hearing (-waggles finger in ear).
Only kidding!
(BTW Decorator is brilliant!)
So the simple answer is to tell these people to buy Giles as part of their pipeline.
Then they still have a choice (I assume) to export finaly as .3DS, .X, .B3D for use in a viewer.
Unless Lee fancies do some more work on his code.
(Lee growls quietly.)
Which would make me look very good, and of course Lee would be included in the credits.
Sorry, did you say 'Money'?
You know, I have this reoccuring problem with my hearing (-waggles finger in ear).
Only kidding!
(BTW Decorator is brilliant!)
Actually Dirk hit the nail on the head. The reason I didn't do this already is that Tattoo creates it's own textures for imported .OBJ files, so the MTL files were not needed.
Still, it's not too much hassle to put it in. I take it the file name for the Material file was tex.mtl ? Or was it one file called cube.mtl with different texture references in it?
Actually, Dirk, can you send me the .OBJ and the .MTL file?
Still, it's not too much hassle to put it in. I take it the file name for the Material file was tex.mtl ? Or was it one file called cube.mtl with different texture references in it?
Actually, Dirk, can you send me the .OBJ and the .MTL file?
Nice one Lee. Thanks for going for it.
sure.
Got em. I'll post the update soon.
Ok. Done it.
This Version scans the associated .mtl file and loads referenced textures.
If there are any problems then let me know. It loads Dirk's one fine. You will probably need to tweak the code to your own purposes. At the moment, it adds blank textures to surfaces without references. For Tattoo it makes sense, for a viewing program it doesn't, so you might want to rem out that bit (I put the comments in to show you where) and optionally scan for plain colors etc.
If you have any 'vertex out of range' problems or models that don't load properly, send them to me to have a look at. Without proper specs on the file format you need lots of examples.
This Version scans the associated .mtl file and loads referenced textures.
If there are any problems then let me know. It loads Dirk's one fine. You will probably need to tweak the code to your own purposes. At the moment, it adds blank textures to surfaces without references. For Tattoo it makes sense, for a viewing program it doesn't, so you might want to rem out that bit (I put the comments in to show you where) and optionally scan for plain colors etc.
If you have any 'vertex out of range' problems or models that don't load properly, send them to me to have a look at. Without proper specs on the file format you need lots of examples.
Yes, your new version works fine, thanks.
Lee, I've zipped up 2 meshes that give a 'vertex out of range' error, for your interest.
But to be honest, even I'm getting tired of this.
There appears to be so much variation in the .obj format (or the way that different programs export it) that despite your sterling efforts I think for safety's sake I'll end up advising the client to use something like 3D Exploration to convert .obj to .3ds or .x, if they must dabble with that format.
Don't get the wrong impression - I know you're a genius - I use Decorator!
It's the other buggers we can't trust.
I just can't in all conscience ask you to do any more work on this.
Thanks.
Lee, I've zipped up 2 meshes that give a 'vertex out of range' error, for your interest.
But to be honest, even I'm getting tired of this.
There appears to be so much variation in the .obj format (or the way that different programs export it) that despite your sterling efforts I think for safety's sake I'll end up advising the client to use something like 3D Exploration to convert .obj to .3ds or .x, if they must dabble with that format.
Don't get the wrong impression - I know you're a genius - I use Decorator!
It's the other buggers we can't trust.
I just can't in all conscience ask you to do any more work on this.
Thanks.
Some interesting stuff going on in those files. :)
Importers are tricky as you need up to date information about the file format and all its quirks.
I'll have a look at trying to sort out the problem (I'm missing something, as it loads into LightWave 8).
Most of the documentation I can find seems to be a bit light on details and often quite old.
If I make any progress I'll post it here.
Importers are tricky as you need up to date information about the file format and all its quirks.
I'll have a look at trying to sort out the problem (I'm missing something, as it loads into LightWave 8).
Most of the documentation I can find seems to be a bit light on details and often quite old.
If I make any progress I'll post it here.
Thanks, Lee.
Remember 'What doesn't destroy us, makes us stronger.'
(Easy for me to say. :)
Remember 'What doesn't destroy us, makes us stronger.'
(Easy for me to say. :)
Alrighty then..
Fixed it...

Download the new version Here.
It appears that they write some additional spaces between fields sometimes (a bad practice, but not too much of a problem). So I added a function to clear out multiple spaces between fields and viola. This loads both examples you sent.
Hope that sorts it for you. ;)
Fixed it...

Download the new version Here.
It appears that they write some additional spaces between fields sometimes (a bad practice, but not too much of a problem). So I added a function to clear out multiple spaces between fields and viola. This loads both examples you sent.
Hope that sorts it for you. ;)
Very cool, Lee.
Outstanding, Lee!
Everybody, shout Lee's genius from the rooftops!
I owe you one.
Thanks.
Everybody, shout Lee's genius from the rooftops!
I owe you one.
Thanks.
No problem. It gave me a better understanding of the File Format than I had before, so can't grumble. :)
When the BlitzMax 3D Module is produced, I'll be making a slightly improved version of a number of things. DecoratorMax anyone! Muahahah. ;)
When the BlitzMax 3D Module is produced, I'll be making a slightly improved version of a number of things. DecoratorMax anyone! Muahahah. ;)
Hey, Lee. Why isn't Decorator on your website?
All I can find is Tattoo.
You must have done other things...
Decorator surely didn't spring fully formed.
All I can find is Tattoo.
You must have done other things...
Decorator surely didn't spring fully formed.
Tattoo was the only commercial one I've done, so the only one with its' own website.
Decorator and other things are scattered around in the Tools Section. My Lightwave and TrueSpace to .B3D convertors are on the 'Specs and Utilities' tab.
Other bits are in the Blitzplus package, couple of bits in the BlitzMax package. Some bits on BlitzCoder. A bit disorganised, but most things were just for fun. :)
Decorator and other things are scattered around in the Tools Section. My Lightwave and TrueSpace to .B3D convertors are on the 'Specs and Utilities' tab.
Other bits are in the Blitzplus package, couple of bits in the BlitzMax package. Some bits on BlitzCoder. A bit disorganised, but most things were just for fun. :)