From: outfrost Date: Mon, 5 Nov 2018 02:12:32 +0000 (+0100) Subject: Render loaded aiScene primitively X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=1bbba195f731f9e425d2f258b474b502b198dc8e;p=shadowclad.git Render loaded aiScene primitively --- diff --git a/main.c b/main.c index cec65b9..7040978 100644 --- a/main.c +++ b/main.c @@ -23,8 +23,14 @@ int main(int argc, char** argv) { init_render(); - import_model("out/assets/wall01.3ds"); - + model = import_model("out/assets/wall01.3ds"); + /* + fprintf(stderr, "*model = "); + print_struct_aiScene(stderr, model); + fprintf(stderr, "\n*(*model).mRootNode = "); + print_struct_aiNode(stderr, (*model).mRootNode); + fprintf(stderr, "\n"); + */ glutMainLoop(); return 0; } diff --git a/render.c b/render.c index 425fc35..c9aa5dc 100644 --- a/render.c +++ b/render.c @@ -1,4 +1,5 @@ #include +#include #include "render.h" #include "typedefs.h" @@ -10,6 +11,7 @@ void render_scene() { glLoadIdentity(); draw_axes(); + draw_model_recursive(model, (*model).mRootNode); glFlush(); glutSwapBuffers(); @@ -41,3 +43,37 @@ void draw_axes() { glVertex3fv(z_axis_end); glEnd(); } + +void draw_model_recursive(const struct aiScene* model, const struct aiNode* node) { + if (((*model).mFlags & AI_SCENE_FLAGS_INCOMPLETE) == AI_SCENE_FLAGS_INCOMPLETE) { + return; + } + + for (int i = 0; i < (*node).mNumMeshes; ++i) { + const struct aiMesh* mesh = (*model).mMeshes[(*node).mMeshes[i]]; + for (int k = 0; k < (*mesh).mNumFaces; ++k) { + const struct aiFace face = (*mesh).mFaces[k]; + + GLenum face_mode; + switch(face.mNumIndices) { + case 1: face_mode = GL_POINTS; break; + case 2: face_mode = GL_LINES; break; + case 3: face_mode = GL_TRIANGLES; break; + default: face_mode = GL_POLYGON; break; + } + + glBegin(face_mode); + + glColor3f(1.0f, 1.0f, 1.0f); + for (int l = 0; l < face.mNumIndices; ++l) { + glVertex3fv((const GLfloat*) &(*mesh).mVertices[face.mIndices[l]]); + } + + glEnd(); + } + } + + for (int i = 0; i < (*node).mNumChildren; ++i) { + draw_model_recursive(model, (*node).mChildren[i]); + } +} diff --git a/render.h b/render.h index 659c4b6..86c3c95 100644 --- a/render.h +++ b/render.h @@ -1,7 +1,10 @@ #ifndef RENDER_H_ #define RENDER_H_ +const struct aiScene* model; + void render_scene(); void draw_axes(); +void draw_model_recursive(const struct aiScene* model, const struct aiNode* node); #endif