howdy
i have just made some code that reads .obj files. this is the first time i have done this, so can someone look at the code demo and tell me if i have gone about this the correct way.
i only wanted some of the code in the file, so focused only on that. also i would put this data into another array for use in game, but didn't do this for this test demo, nor did i use the surface data in the .mtl file for textures (i left it in there anyway).
i just wanted to see the data on screen and see if it was correct.
the commands i used was SplitToArray() that uses a temp array to read the data.
> first searched the file for "v " (v + space) as the first data on the line, then read the text data into float array.
> then searched the file for "f " (f + space) as the fisrt data on the line, then read the text data into string array (step 1/2).
>then read that string array to split it by the "//" , as there was numbers before and after this, then put data into int array (step 2/2).
you can use notepad / notepad 2.0 to see the data yourself.
i appreciate any advice, stevmjon
Just putting this link here for reference.
OBJ FILE FORMAT (https://www.cs.cmu.edu/~mbz/personal/graphics/obj.html)
thanks for the link kev, that has interesting reference i didn't know about.
the point of posting this thread, was mainly to know if my use of "SplitToArray" was the correct way to read the string data, one line at a time.
> so, reading the vector data "v " was straight forward, i only used "SplitToArray" once per line here. the data was seperated by blank spaces so was simple check.
> then, reading the face data "f " was multiple use of "SplitToArray" per line. first i needed the data between spaces, then needed each seperate data checked again by seperating data by // .
so is this correct, or should i go through the "f " line one character at a time instead, grabbong data this way? i don't know how check one character at a time...
any advice is welcomed, stevmjon
Quote
so is this correct, or should i go through the "f " line one character at a time instead, grabbong data this way? i don't know how check one character at a time.
I was writing an example but life got in the way, but prolly both ways. So for lines that are always known to be simple, like a vertex with 3 values separated by spaces, then split is a nice easy and quick way. But if the values have some secondary data, then parsing is character by character might indeed be a better way. You can prolly get away with doing an instring on the face lines for Hash characters and then choosing how to proceed. I don't really know what formats to expect so I can't really help there. Might be an idea to have a look at some more object files. See if any common and easy patterns seem obvious.
[pbcode]
Function LoadOBj(File$)
if Fileexist(file$)=false then exitfunction false
size=filesize(file$)
fh=readnewfile(file$)
if fh
// Load entire file into a string
s$=readchr$(fh,Size)
closefile fh
// Strip line feeds
s$=replace$(s$,chr$(10),"")
// Split to this array
Dim Obj$(10000)
RowCount = splittoarray(s$,chr$(13),Obj$())
// Array use to translate floats into
Dim _FloatArray#(256)
// Scan the file for control codes
For lp =0 to RowCount-1
s$=Obj$(lp)
ThisCHR = mid(s$,1)
// check for comment row, if so, skip
if ThisCHR=asc("#") then continue
Pos = instring(s$," ")
if pos<1 then continue ; Skip with no spaces
Opcode$=left$(s$,pos-1)
Params$ =cutleft$(s$,pos)
// ---------------------------------------------------
Select Opcode$
// ---------------------------------------------------
// --------------------------------------------------
// v = Vertex
// --------------------------------------------------
case "v"
// Vertex data separated by spaces
Count= splittoarray(Params$," ",_FloatArray#())
if Count=3
print _FloatArray#(0)
print _FloatArray#(1)
print _FloatArray#(2)
else
print "Error in vertex ?"
endif
// vn = vertex normal
case "vn"
// vt = vertex face ?
case "vt"
// --------------------------------------------------
// f = Face
// --------------------------------------------------
case "f"
EndSelect
next
endif
EndFunction Status
[/pbcode]
thanks for the input kev.
thought i would post a screenshot of the file loaded into my game, and displayed as wireframe for now.
the object is the house, and i added a few cubes in the scene as well.
very exciting for me, as this is the first time i have done this. so now i can make 3D objects using 3D software, then load them into the game, yay.
stevmjon