loading some geometry, no display yet
This commit is contained in:
parent
0cc9eb0b38
commit
159de19873
@ -1,4 +1,4 @@
|
|||||||
// raddbg 0.9.17 project file
|
// raddbg 0.9.21 project file
|
||||||
|
|
||||||
recent_file: path: "src/render/render_core.c"
|
recent_file: path: "src/render/render_core.c"
|
||||||
recent_file: path: "d:/os/obj/amd64fre/minkernel/crts/ucrt/src/appcrt/heap/mt/objfre/amd64/minkernel/crts/ucrt/src/appcrt/heap/free_base.cpp"
|
recent_file: path: "d:/os/obj/amd64fre/minkernel/crts/ucrt/src/appcrt/heap/mt/objfre/amd64/minkernel/crts/ucrt/src/appcrt/heap/free_base.cpp"
|
||||||
@ -13,8 +13,3 @@ target:
|
|||||||
working_directory: build
|
working_directory: build
|
||||||
enabled: 1
|
enabled: 1
|
||||||
}
|
}
|
||||||
breakpoint:
|
|
||||||
{
|
|
||||||
source_location: "src/render/render_core.c:102:1"
|
|
||||||
hit_count: 1
|
|
||||||
}
|
|
||||||
|
|||||||
@ -40,7 +40,7 @@ entry_point()
|
|||||||
os_event_init();
|
os_event_init();
|
||||||
r_init();
|
r_init();
|
||||||
|
|
||||||
r_load_obj(obj_filename);
|
r_load_obj(arena, obj_filename);
|
||||||
|
|
||||||
//test_arena(arena);
|
//test_arena(arena);
|
||||||
|
|
||||||
@ -59,8 +59,6 @@ entry_point()
|
|||||||
DispatchMessageW(&Message);
|
DispatchMessageW(&Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(U64 i = 0; i < os_events_received_on_frame(); i += 1)
|
for(U64 i = 0; i < os_events_received_on_frame(); i += 1)
|
||||||
{
|
{
|
||||||
OS_Event *event = &os_events.list[i];
|
OS_Event *event = &os_events.list[i];
|
||||||
@ -79,10 +77,8 @@ entry_point()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
r_render();
|
r_render();
|
||||||
|
|
||||||
|
|
||||||
os_event_reset();
|
os_event_reset();
|
||||||
//r_log_debug_messages();
|
//r_log_debug_messages();
|
||||||
if(g_do_exit)
|
if(g_do_exit)
|
||||||
@ -94,5 +90,4 @@ entry_point()
|
|||||||
r_cleanup();
|
r_cleanup();
|
||||||
|
|
||||||
arena_release(arena);
|
arena_release(arena);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//~
|
//~
|
||||||
|
R_GeomList *r_geomlist = 0;
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
r_tinyobj_get_file_data(void *ctx, const char *filename, const int is_mtl,
|
r_tinyobj_get_file_data(void *ctx, const char *filename, const int is_mtl,
|
||||||
@ -66,8 +66,12 @@ r_tinyobj_get_file_data(void *ctx, const char *filename, const int is_mtl,
|
|||||||
|
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
r_load_obj(const char *filename)
|
r_load_obj(Arena *arena, const char *filename)
|
||||||
{
|
{
|
||||||
|
r_geomlist = (R_GeomList *)push_array(arena, R_GeomList, 1);
|
||||||
|
R_Geom *geom = &r_geomlist->geom[r_geomlist->free_idx];
|
||||||
|
r_geomlist->free_idx += 1;
|
||||||
|
|
||||||
// tinyobj stuff, TODO(anton): Write my own obj loader and remove this.
|
// tinyobj stuff, TODO(anton): Write my own obj loader and remove this.
|
||||||
tinyobj_attrib_t attrib;
|
tinyobj_attrib_t attrib;
|
||||||
tinyobj_shape_t *shapes = 0;
|
tinyobj_shape_t *shapes = 0;
|
||||||
@ -77,7 +81,6 @@ r_load_obj(const char *filename)
|
|||||||
|
|
||||||
|
|
||||||
// Init tinyobj
|
// Init tinyobj
|
||||||
//tinyobj_attrib_init(&attrib);
|
|
||||||
R_TinyOBJ_Helper tinyobj_helper = {0};
|
R_TinyOBJ_Helper tinyobj_helper = {0};
|
||||||
U32 ret = tinyobj_parse_obj(&attrib, &shapes, &shape_count, &materials, &material_count,
|
U32 ret = tinyobj_parse_obj(&attrib, &shapes, &shape_count, &materials, &material_count,
|
||||||
filename, r_tinyobj_get_file_data, (void *)&tinyobj_helper, TINYOBJ_FLAG_TRIANGULATE);
|
filename, r_tinyobj_get_file_data, (void *)&tinyobj_helper, TINYOBJ_FLAG_TRIANGULATE);
|
||||||
@ -93,6 +96,85 @@ r_load_obj(const char *filename)
|
|||||||
LOG("Material count: %u \n", material_count);
|
LOG("Material count: %u \n", material_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Size of one element of the OBJ
|
||||||
|
U64 element_byte_count = sizeof(F32) * 3 // pos
|
||||||
|
+ sizeof(F32) * 3; // normal
|
||||||
|
U32 stride = element_byte_count / sizeof(F32);
|
||||||
|
U32 num_triangles = attrib.num_face_num_verts;
|
||||||
|
|
||||||
|
U64 buffer_byte_count = element_byte_count * num_triangles * 3;
|
||||||
|
|
||||||
|
// Allocate space for the vertex buffer data and store necessary info for geom
|
||||||
|
geom->data = (F32 *)push_array(arena, U8, buffer_byte_count);
|
||||||
|
geom->stride = stride;
|
||||||
|
geom->num_triangles = num_triangles;
|
||||||
|
geom->element_byte_count = element_byte_count;
|
||||||
|
geom->byte_count = buffer_byte_count;
|
||||||
|
|
||||||
|
U32 face_offset = 0;
|
||||||
|
for (U32 tri_idx = 0; tri_idx < attrib.num_face_num_verts; tri_idx += 1)
|
||||||
|
{
|
||||||
|
U32 face_num_vert = attrib.face_num_verts[tri_idx];
|
||||||
|
if(face_num_vert % 3 != 0)
|
||||||
|
{
|
||||||
|
LOG("Got non triangular face! abort!! \n");
|
||||||
|
Trap();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (U32 f = 0; f < face_num_vert / 3; f += 1)
|
||||||
|
{
|
||||||
|
F32 v[3][3];
|
||||||
|
F32 n[3][3];
|
||||||
|
|
||||||
|
tinyobj_vertex_index_t vi0 = attrib.faces[face_offset + f * 3 + 0];
|
||||||
|
tinyobj_vertex_index_t vi1 = attrib.faces[face_offset + f * 3 + 1];
|
||||||
|
tinyobj_vertex_index_t vi2 = attrib.faces[face_offset + f * 3 + 2];
|
||||||
|
|
||||||
|
U32 k;
|
||||||
|
// For each component k of the three vertices for this face:
|
||||||
|
for(k = 0; k < 3; k += 1)
|
||||||
|
{
|
||||||
|
S32 idx0 = vi0.v_idx;
|
||||||
|
S32 idx1 = vi1.v_idx;
|
||||||
|
S32 idx2 = vi2.v_idx;
|
||||||
|
|
||||||
|
Assert(idx0 >= 0 && idx1 >= 0 && idx2 >= 0);
|
||||||
|
|
||||||
|
v[0][k] = attrib.vertices[3 * idx0 + k];
|
||||||
|
v[1][k] = attrib.vertices[3 * idx1 + k];
|
||||||
|
v[2][k] = attrib.vertices[3 * idx2 + k];
|
||||||
|
// Can add BBox calculation here
|
||||||
|
}
|
||||||
|
|
||||||
|
for(k = 0; k < 3; k += 1)
|
||||||
|
{
|
||||||
|
S32 idx0 = vi0.vn_idx;
|
||||||
|
S32 idx1 = vi1.vn_idx;
|
||||||
|
S32 idx2 = vi2.vn_idx;
|
||||||
|
|
||||||
|
Assert(idx0 >= 0 && idx1 >= 0 && idx2 >= 0);
|
||||||
|
|
||||||
|
n[0][k] = attrib.normals[3 * idx0 + k];
|
||||||
|
n[1][k] = attrib.normals[3 * idx1 + k];
|
||||||
|
n[2][k] = attrib.normals[3 * idx2 + k];
|
||||||
|
// Can add BBox calculation here
|
||||||
|
}
|
||||||
|
|
||||||
|
for(k = 0; k < 3; k +=1)
|
||||||
|
{
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 0] = v[k][0];
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 1] = v[k][1];
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 2] = v[k][2];
|
||||||
|
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 3] = n[k][0];
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 4] = n[k][1];
|
||||||
|
geom->data[(3 * tri_idx + k) * stride + 5] = n[k][2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
face_offset += face_num_vert;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
tinyobj_attrib_free(&attrib);
|
tinyobj_attrib_free(&attrib);
|
||||||
|
|||||||
@ -37,6 +37,24 @@ struct R_BatchList
|
|||||||
U64 byte_per_instance;
|
U64 byte_per_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct R_Geom R_Geom;
|
||||||
|
struct R_Geom
|
||||||
|
{
|
||||||
|
F32 *data;
|
||||||
|
U64 stride;
|
||||||
|
U64 num_triangles;
|
||||||
|
U64 element_byte_count;
|
||||||
|
U64 byte_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct R_GeomList R_GeomList;
|
||||||
|
struct R_GeomList
|
||||||
|
{
|
||||||
|
Arena *arena;
|
||||||
|
R_Geom geom[4];
|
||||||
|
U64 free_idx;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//~
|
//~
|
||||||
@ -44,7 +62,7 @@ struct R_BatchList
|
|||||||
|
|
||||||
internal void r_init();
|
internal void r_init();
|
||||||
internal void r_render();
|
internal void r_render();
|
||||||
internal void r_load_obj(const char *filename);
|
internal void r_load_obj(Arena *arena, const char *filename);
|
||||||
|
|
||||||
|
|
||||||
internal void r_log_debug_messages();
|
internal void r_log_debug_messages();
|
||||||
|
|||||||
2
src/third_party/tinyobj/tinyobj_loader_c.c
vendored
Normal file
2
src/third_party/tinyobj/tinyobj_loader_c.c
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
// tinyobj_loader_c.c
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user