Quote: "MAKE OBJECT NEW objectNum, f_cnt * 3, f_cnt * 3, FVF_XYZ || FVF_NORMAL || FVF_TEX2"
Shouldn't one f_cnt*3 be vertex count and the other index_count?
EDIT:
There's something you did wrong ->you set the faces and at the same time you set the vertices and somewhere in that process you messed up. Here is corrected version where vertices are set first and then faces.
TYPE Vertex3D
x As FLOAT
y AS FLOAT
z AS FLOAT
ENDTYPE
TYPE VertNormal3D
i As FLOAT
j AS FLOAT
k AS FLOAT
ENDTYPE
TYPE TexCoord2D
u As FLOAT
v As FLOAT
ENDTYPE
TYPE Face3D
p1 As Integer
vt1 As Integer
vn1 As Integer
p2 As Integer
vt2 As Integer
vn2 As Integer
p3 As Integer
vt3 As Integer
vn3 As Integer
ENDTYPE
AUTOCAM OFF
POSITION CAMERA 0, 0, 100
POINT CAMERA 0, 0, 0
LoadOBJ("grassfield.obj", 1)
LOAD IMAGE "grass.bmp", 1
TEXTURE OBJECT 1, 1
POSITION OBJECT 1, 0, 0, 0
set object wireframe 1,1
DO
if upkey()=1 then move camera 1
if downkey()=1 then move camera -1
xrotate camera camera angle x()+mousemovey()
yrotate camera camera angle y()+mousemovex()
LOOP
FUNCTION LoadOBJ(filename As String, objectNum As Integer)
` Open File
` Parse through each line, figure out what type of data
` we are dealing with, then work with it.
Local filenum As Integer = 1
Local f_cnt As Integer = 0
Local v_cnt As Integer = 0
Local i As Integer = 0
Local j As Integer = 0
Dim vert_list() As Vertex3D
Dim vn_list() As VertNormal3D
Dim vt_list() As TexCoord2D
Dim tri_list() As Face3D
Empty Array vert_list()
Empty Array vn_list()
Empty Array vt_list()
Empty Array tri_list()
OPEN TO READ filenum, filename
IF FILE OPEN(filenum) = 1
WHILE (FILE END(filenum) <> 1)
`Get string from file
READ STRING filenum, txt$
`Split string up into command and arguments
cmd$ = FIRST TOKEN$(txt$, " ")
`Determine what command is, and what to do about it
SELECT cmd$
CASE "v":
`Command is vertex
Array Insert At Bottom vert_list()
`Array Index To Bottom vert_list()
vert_list().x = Val(NEXT TOKEN$(" "))
vert_list().y = Val(NEXT TOKEN$(" "))
vert_list().z = Val(NEXT TOKEN$(" "))
v_cnt = v_cnt + 1
ENDCASE
CASE "vn":
`Command is vertex normal
Array Insert At Bottom vn_list()
`Array Index To Bottom vn_list()
vn_list().i = Val(NEXT TOKEN$(" "))
vn_list().j = Val(NEXT TOKEN$(" "))
vn_list().k = Val(NEXT TOKEN$(" "))
ENDCASE
CASE "vt":
`Command is texture coordinate
Array Insert At Bottom vt_list()
`Array Index To Bottom vt_list()
vt_list().u = Val(NEXT TOKEN$(" "))
vt_list().v = Val(NEXT TOKEN$(" "))
ENDCASE
CASE "f":
`Command is face info
Array Insert At Bottom tri_list()
temp1$ = NEXT TOKEN$(" ")
temp2$ = NEXT TOKEN$(" ")
temp3$ = NEXT TOKEN$(" ")
`Point 1
tri_list().p1 = Val(FIRST TOKEN$(temp1$, "/"))
tri_list().vt1 = Val(NEXT TOKEN$("/"))
tri_list().vn1 = Val(NEXT TOKEN$("/"))
`Point 2
tri_list().p2 = Val(FIRST TOKEN$(temp2$, "/"))
tri_list().vt2 = Val(NEXT TOKEN$("/"))
tri_list().vn2 = Val(NEXT TOKEN$("/"))
`Point 3
tri_list().p3 = Val(FIRST TOKEN$(temp3$, "/"))
tri_list().vt3 = Val(NEXT TOKEN$("/"))
tri_list().vn3 = Val(NEXT TOKEN$("/"))
f_cnt = f_cnt + 1
ENDCASE
ENDSELECT
ENDWHILE
`Make object
MAKE OBJECT NEW objectNum, v_cnt, f_cnt * 3, FVF_XYZ || FVF_NORMAL || FVF_TEX2
Array Index To Bottom tri_list()
Lock VertexData For Limb objectNum, 0
for i=0 to v_cnt-1
SET VERTEXDATA POSITION i, vert_list(i).x, vert_list(i).y, vert_list(i).z
SET VERTEXDATA NORMALS i, vn_list(i).i, vn_list(i).j, vn_list(i).k
SET VERTEXDATA UV i, vt_list(i).u, vt_list(i).v
next i
`Set up vertices
For i = 0 To ((f_cnt) - 1)
//SET VERTEXDATA POSITION j, vert_list(tri_list(i).p1 - 1).x, vert_list(tri_list(i).p1 - 1).y, vert_list(tri_list(i).p1 - 1).z
//SET VERTEXDATA NORMALS j, vn_list(tri_list(i).vn1 - 1).i, vn_list(tri_list(i).vn1 - 1).j, vn_list(tri_list(i).vn1 - 1).k
//SET VERTEXDATA UV j, vt_list(tri_list(i).vt1 - 1).u, vt_list(tri_list(i).vt1 - 1).v
SET INDEXDATA j, tri_list(i).p1 - 1
j = j + 1
//SET VERTEXDATA POSITION j, vert_list(tri_list(i).p2 - 1).x, vert_list(tri_list(i).p2 - 1).y, vert_list(tri_list(i).p2 - 1).z
//SET VERTEXDATA NORMALS j, vn_list(tri_list(i).vn2 - 1).i, vn_list(tri_list(i).vn2 - 1).j, vn_list(tri_list(i).vn2 - 1).k
//SET VERTEXDATA UV j, vt_list(tri_list(i).vt2 - 1).u, vt_list(tri_list(i).vt2 - 1).v
SET INDEXDATA j, tri_list(i).p2 - 1
j = j + 1
//SET VERTEXDATA POSITION j, vert_list(tri_list(i).p3 - 1).x, vert_list(tri_list(i).p3 - 1).y, vert_list(tri_list(i).p3 - 1).z
//SET VERTEXDATA NORMALS j, vn_list(tri_list(i).vn3 - 1).i, vn_list(tri_list(i).vn3 - 1).j, vn_list(tri_list(i).vn3 - 1).k
//SET VERTEXDATA UV j, vt_list(tri_list(i).vt3 - 1).u, vt_list(tri_list(i).vt3 - 1).v
SET INDEXDATA j, tri_list(i).p3 - 1
j = j + 1
NEXT
Unlock VertexData
CLOSE FILE filenum
ENDIF
ENDFUNCTION
` FVF constants
#constant FVF_XYZ = 0x002
#constant FVF_XYZRHW = 0x004
#constant FVF_NORMAL = 0x010
#constant FVF_PSIZE = 0x020
#constant FVF_DIFFUSE = 0x040
#constant FVF_SPECULAR = 0x080
#constant FVF_TEX0 = 0x000
#constant FVF_TEX1 = 0x100
#constant FVF_TEX2 = 0x200
#constant FVF_TEX3 = 0x300
#constant FVF_TEX4 = 0x400
#constant FVF_TEX5 = 0x500
#constant FVF_TEX6 = 0x600
#constant FVF_TEX7 = 0x700
#constant FVF_TEX8 = 0x800