#ifndef RES_MODEL_H_INCLUDED #define RES_MODEL_H_INCLUDED #include enum { Vbo_Unload = 0, Vbo_Loaded, Vbo_BufGen, Vbo_LoadFail, }; #define VBO_HDR_NONE 0 #define VBO_HDR_NORML 1 #define VBO_HDR_TEXC 2 #define VBO_HDR_NOR_TXC (VBO_HDR_NORML|VBO_HDR_TEXC) static const char *vboFilePath[] = { // "./Res/model3d/CarTestPrd.vbo", // "./Res/model3d/CarTestPrd.vbo", // "./Res/model3d/CarTestPrd.vbo", // "./Res/model3d/CarLargePrd.vbo", // "./Res/model3d/CarMediumPrd.vbo", // "./Res/model3d/CarSmallPrd.vbo", // "./Res/model3d/TexCarLarge_rd0.vbo", // "./Res/model3d/TexCarMedium.vbo", // "./Res/model3d/TexCarSmall.vbo", "./Res/model3d/truck_1.vbo", "./Res/model3d/car_1.vbo",//car_1 "./Res/model3d/bicycle_1.vbo", }; enum { VBO_CarLarge = 0, VBO_CarMedium, VBO_CarSmall, VBO_NUM, }; static GLfloat vboMaterialGray[] = { 0.3f, 0.3f, 0.3f, 1.0f, 0.3f, 0.3f, 0.3f, 1.0f, 0.3f, 0.3f, 0.3f, 1.0f, 0.0f, 5.0f, 40.0f, 1.0f, }; static GLfloat vboMaterialRed[] = { 0.5f, 0.25f, 0.25f, 1.0f, 0.4f, 0.3f, 0.3f, 1.0f, 0.35f, 0.3f, 0.3f, 1.0f, 0.0f, 5.0f, 40.0f, 1.0f, }; static GLfloat vboMaterialBlue[] = { 0.1f, 0.2f, 0.45f, 1.0f, 0.1f, 0.2f, 0.45f, 1.0f, 0.1f, 0.2f, 0.45f, 1.0f, 0.0f, 5.0f, 40.0f, 1.0f, }; static UInt08 vboStatus[VBO_NUM]; static Model3DVbo vboModel[VBO_NUM]; static const GLenum vboIdxType[5] = { GL_UNSIGNED_BYTE, /*-0-*/ GL_UNSIGNED_BYTE, /* 1 */ GL_UNSIGNED_SHORT, /* 2 */ GL_UNSIGNED_SHORT, /*-3-*/ GL_UNSIGNED_INT, /* 4 */ }; static void Once_InitVboModelInfo() { static Bool flag = INS_FALSE; if(flag == INS_TRUE)return; flag = INS_TRUE; Int32 i; for(i = 0; i < VBO_NUM; i++) { vboModel[i].hdr = VBO_NOT_NOR_AND_TXC; vboModel[i].idx_type = 1; vboModel[i].idx_num = 0; vboModel[i].face_num = 0; vboModel[i].vtxs = NULL; vboModel[i].txcs = NULL; vboModel[i].nors = NULL; vboModel[i].idx = NULL; vboModel[i].buf[0] = INS_INVALID_RES_ID; vboModel[i].buf[1] = INS_INVALID_RES_ID; vboModel[i].buf[2] = INS_INVALID_RES_ID; vboModel[i].buf[3] = INS_INVALID_RES_ID; vboStatus[i] = Vbo_Unload; } } static void Once_LoadVboModelData(Int32 id) { if(id < 0 || id >= VBO_NUM || vboStatus[id] != Vbo_Unload)return; PrintCurrentTimeMs(); printf("loading vbo file[%s]\n", vboFilePath[id]); if(LoadVbo(&vboModel[id], vboFilePath[id]) != INS_TRUE) { printf("load vbo file fail[%s]\n", vboFilePath[id]); vboStatus[id] = Vbo_LoadFail; return; } vboStatus[id] = Vbo_Loaded; PrintCurrentTimeMs(); } enum{VBO_BUF_VTX = 0, VBO_BUF_TXC, VBO_BUF_NOR, VBO_BUF_IDX}; static void Once_GenVboBuffer(Int32 id) { if(vboModel[id].vtxs == NULL || (vboModel[id].txcs == NULL && vboModel[id].nors == NULL))return; vboStatus[id] = Vbo_BufGen; PrintCurrentTimeMs(); // printf("generating vbo buffer[%s]\n", vboFilePath[id]); // printf("Once_GenVboBuffer GL_ERR_CODE[0x%x]\n", glGetError()); glGenBuffers(4, vboModel[id].buf); // printf("glGenBuffers GL_ERR_CODE[0x%x]\n", glGetError()); glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_VTX]); // printf("glBindBuffer vtx GL_ERR_CODE[0x%x]\n", glGetError()); glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*3*sizeof(Flt32), vboModel[id].vtxs, GL_STATIC_DRAW); // printf("glBufferData vtx GL_ERR_CODE[0x%x]\n", glGetError()); if((vboModel[id].hdr & VBO_HAVA_TEXTCOORDS) && vboModel[id].txcs != NULL) { glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_TXC]); // printf("glBindBuffer txc GL_ERR_CODE[0x%x]\n", glGetError()); glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*2*sizeof(Flt32), vboModel[id].txcs, GL_STATIC_DRAW); // printf("glBufferData txc GL_ERR_CODE[0x%x]\n", glGetError()); } if((vboModel[id].hdr & VBO_HAVA_NORMALS) && vboModel[id].nors != NULL) { glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_NOR]); // printf("glBindBuffer nor GL_ERR_CODE[0x%x]\n", glGetError()); glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*3*sizeof(Flt32), vboModel[id].nors, GL_STATIC_DRAW); // printf("glBufferData nor GL_ERR_CODE[0x%x]\n", glGetError()); } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_IDX]); // printf("glBindBuffer idx GL_ERR_CODE[0x%x]\n", glGetError()); switch(vboModel[id].idx_type) { case 4: // *idx_type = GL_UNSIGNED_INT; glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt32), vboModel[id].idx, GL_STATIC_DRAW); // printf("glBufferData idx 4 GL_ERR_CODE[0x%x]\n", glGetError()); break; case 2: // *idx_type = GL_UNSIGNED_SHORT; glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt16), vboModel[id].idx, GL_STATIC_DRAW); // printf("glBufferData idx 2 GL_ERR_CODE[0x%x]\n", glGetError()); break; default: // *idx_type = GL_UNSIGNED_BYTE; glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt08), vboModel[id].idx, GL_STATIC_DRAW); // printf("glBufferData idx 1 GL_ERR_CODE[0x%x]\n", glGetError()); break; } PrintCurrentTimeMs(); } static void DestroyVboResources() { Int32 i; for(i = 0; i < VBO_NUM; i++) { if(vboModel[i].vtxs != NULL) { free(vboModel[i].vtxs); } if(vboModel[i].txcs != NULL) { free(vboModel[i].txcs); } if(vboModel[i].nors != NULL) { free(vboModel[i].nors); } if(vboModel[i].idx != NULL) { free(vboModel[i].idx); } if(vboModel[i].buf[VBO_BUF_VTX] != INS_INVALID_RES_ID) { glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_VTX])); vboModel[i].buf[VBO_BUF_VTX] = INS_INVALID_RES_ID; } if(vboModel[i].buf[VBO_BUF_TXC] != INS_INVALID_RES_ID) { glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_TXC])); vboModel[i].buf[VBO_BUF_TXC] = INS_INVALID_RES_ID; } if(vboModel[i].buf[VBO_BUF_NOR] != INS_INVALID_RES_ID) { glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_NOR])); vboModel[i].buf[VBO_BUF_NOR] = INS_INVALID_RES_ID; } if(vboModel[i].buf[VBO_BUF_IDX] != INS_INVALID_RES_ID) { glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_IDX])); vboModel[i].buf[VBO_BUF_IDX] = INS_INVALID_RES_ID; } vboStatus[i] = Vbo_Unload; } } #endif // RES_MODEL_H_INCLUDED