glhckTexture* textureFromMaterial(const char *file, const struct aiMaterial *mtl) { glhckTexture *texture; struct aiString textureName; enum aiTextureMapping textureMapping; enum aiTextureOp op; enum aiTextureMapMode textureMapMode[3] = {0,0,0}; unsigned int uvwIndex, flags; float blend; char *texturePath; glhckTextureParameters params; assert(file && mtl); if (!aiGetMaterialTextureCount(mtl, aiTextureType_DIFFUSE)) return NULL; if (aiGetMaterialTexture(mtl, aiTextureType_DIFFUSE, 0, &textureName, &textureMapping, &uvwIndex, &blend, &op, textureMapMode, &flags) != AI_SUCCESS) return NULL; memcpy(¶ms, glhckTextureDefaultParameters(), sizeof(glhckTextureParameters)); switch (textureMapMode[0]) { case aiTextureMapMode_Clamp: case aiTextureMapMode_Decal: params.wrapR = GLHCK_WRAP_CLAMP_TO_EDGE; params.wrapS = GLHCK_WRAP_CLAMP_TO_EDGE; params.wrapT = GLHCK_WRAP_CLAMP_TO_EDGE; break; case aiTextureMapMode_Mirror: params.wrapR = GLHCK_WRAP_MIRRORED_REPEAT; params.wrapS = GLHCK_WRAP_MIRRORED_REPEAT; params.wrapT = GLHCK_WRAP_MIRRORED_REPEAT; break; default: break; } if (!(texturePath = _glhckImportTexturePath(textureName.data, file))) return NULL; DEBUG(0, "%s", texturePath); texture = glhckTextureNewFromFile(texturePath, NULL, ¶ms); _glhckFree(texturePath); return texture; }
int main(int argc, char **argv) { GLFWwindow* window; glhckTexture *texture; glhckMaterial *material; glhckObject *cube, *sprite, *cube2, *sprite3, *camObj; glhckCamera *camera; const kmAABB *aabb; kmVec3 cameraPos = { 0, 0, 0 }; kmVec3 cameraRot = { 0, 0, 0 }; float spinRadius; int queuePrinted = 0; float now = 0; float last = 0; unsigned int frameCounter = 0; unsigned int FPS = 0; unsigned int fpsDelay = 0; float duration = 0; float delta = 0; char WIN_TITLE[256]; memset(WIN_TITLE, 0, sizeof(WIN_TITLE)); glfwSetErrorCallback(error_callback); if (!glfwInit()) return EXIT_FAILURE; puts("-!- glfwinit"); glhckCompileFeatures features; glhckGetCompileFeatures(&features); if (features.render.glesv1 || features.render.glesv2) { glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_DEPTH_BITS, 16); } if (features.render.glesv2) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); } if (features.render.opengl) { glfwWindowHint(GLFW_DEPTH_BITS, 24); } if (!(window = glfwCreateWindow(WIDTH, HEIGHT, "display test", NULL, NULL))) return EXIT_FAILURE; glfwMakeContextCurrent(window); puts("-!- window create"); /* Turn on VSYNC if driver allows */ glfwSwapInterval(0); if (!glhckContextCreate(argc, argv)) return EXIT_FAILURE; puts("-!- glhck init"); if (!glhckDisplayCreate(WIDTH, HEIGHT, GLHCK_RENDER_AUTO)) return EXIT_FAILURE; puts("-!- glhck display create"); RUNNING = 1; /* test camera */ if (!(camera = glhckCameraNew())) return EXIT_FAILURE; glhckCameraRange(camera, 1.0f, 1000.0f); camObj = glhckCameraGetObject(camera); if (!(texture = glhckTextureNewFromFile("example/media/glhck.png", NULL, NULL))) return EXIT_FAILURE; if (!(material = glhckMaterialNew(texture))) return EXIT_FAILURE; glhckTextureFree(texture); sprite = glhckSpriteNew(texture, 0, 0); cube2 = glhckCubeNew(1.0f); glhckObjectDrawAABB(cube2, 1); glhckObjectDrawOBB(cube2, 1); glhckObjectScalef(cube2, 1.0f, 1.0f, 2.0f); glhckObjectMaterial(cube2, material); sprite3 = glhckObjectCopy(sprite); glhckObjectScalef(sprite, 0.05f, 0.05f, 0.05f); glhckObjectPositionf(sprite3, 64*2, 48*2, 0); #define SKIP_MMD 0 #define SKIP_OCTM 0 #define SKIP_ASSIMP 0 #if SKIP_MMD # define MMD_PATH "" #else # define MMD_PATH "example/media/madoka/md_m.pmd" #endif #if SKIP_OCTM # define OCTM_PATH "" #else # define OCTM_PATH "example/media/ambulance/ambulance.ctm" #endif /* cmake -DGLHCK_IMPORT_ASSIMP=YES */ #if SKIP_ASSIMP # define ASSIMP_PATH "" #else //# define ASSIMP_PATH "example/media/chaosgate/chaosgate.obj" //# define ASSIMP_PATH "example/media/room/room.obj" //# define ASSIMP_PATH "example/media/alletine.x" # define ASSIMP_PATH "example/media/player.x" #endif glhckImportModelParameters animatedParams; memcpy(&animatedParams, glhckImportDefaultModelParameters(), sizeof(glhckImportModelParameters)); animatedParams.animated = 1; if ((cube = glhckModelNewEx(MMD_PATH, 1.0f, NULL, GLHCK_INDEX_SHORT, GLHCK_VERTEX_V3S))) { cameraPos.y = 10.0f; cameraPos.z = -40.0f; } else if ((cube = glhckModelNewEx(OCTM_PATH, 5.0f, NULL, GLHCK_INDEX_SHORT, GLHCK_VERTEX_V3S))) { cameraPos.y = 10.0f; cameraPos.z = -40.0f; glhckObjectPositionf(cube, 0.0f, 5.0f, 0.0f); } else if ((cube = glhckModelNewEx(ASSIMP_PATH, 0.1f, &animatedParams, GLHCK_INDEX_SHORT, GLHCK_VERTEX_V3S))) { glhckMaterial *mat; glhckTexture *tex; if ((tex = glhckTextureNewFromFile("example/media/texture-b.png", NULL, NULL))) { if ((mat = glhckMaterialNew(tex))) glhckObjectMaterial(cube, mat); glhckTextureFree(tex); } glhckObjectMovef(cube, 0, 15, 0); cameraPos.y = 10.0f; cameraPos.z = -40.0f; } else if ((cube = glhckCubeNew(1.0f))) { glhckObjectMaterial(cube, material); cameraPos.z = -20.0f; } else return EXIT_FAILURE; #define SHADOW 0 #if SHADOW glhckShader *shader = glhckShaderNew(NULL, "VSM.GLhck.Lighting.ShadowMapping.Unpacking.Fragment", NULL); glhckShader *depthShader = glhckShaderNew(NULL, "VSM.GLhck.Depth.Packing.Fragment", NULL); glhckShader *depthRenderShader = glhckShaderNew(NULL, "VSM.GLhck.DepthRender.Unpacking.Fragment", NULL); glhckShaderSetUniform(shader, "ShadowMap", 1, &((int[]){1}));
/* \brief import MikuMikuDance PMD file */ int _glhckImportPMD(_glhckObject *object, const char *file, const glhckImportModelParameters *params, glhckGeometryIndexType itype, glhckGeometryVertexType vtype) { FILE *f; char *texturePath; mmd_data *mmd = NULL; glhckAtlas *atlas = NULL; glhckMaterial *material = NULL; glhckTexture *texture = NULL, **textureList = NULL; glhckImportVertexData *vertexData = NULL; glhckImportIndexData *indices = NULL, *stripIndices = NULL; unsigned int geometryType = GLHCK_TRIANGLE_STRIP; unsigned int i, i2, ix, start, numFaces, numIndices = 0; CALL(0, "%p, %s, %p", object, file, params); if (!(f = fopen(file, "rb"))) goto read_fail; if (!(mmd = mmd_new(f))) goto mmd_no_memory; if (mmd_read_header(mmd) != 0) goto mmd_import_fail; if (mmd_read_vertex_data(mmd) != 0) goto mmd_import_fail; if (mmd_read_index_data(mmd) != 0) goto mmd_import_fail; if (mmd_read_material_data(mmd) != 0) goto mmd_import_fail; /* close file */ NULLDO(fclose, f); if (mmd->header.name) { DEBUG(GLHCK_DBG_CRAP, "%s\n", mmd->header.name); } if (mmd->header.comment) printf("%s\n\n", mmd->header.comment); if (!(vertexData = _glhckCalloc(mmd->num_vertices, sizeof(glhckImportVertexData)))) goto mmd_no_memory; if (!(indices = _glhckMalloc(mmd->num_indices * sizeof(unsigned int)))) goto mmd_no_memory; if (!(textureList = _glhckCalloc(mmd->num_materials, sizeof(_glhckTexture*)))) goto mmd_no_memory; if (!(atlas = glhckAtlasNew())) goto mmd_no_memory; /* add all textures to atlas packer */ for (i = 0; i < mmd->num_materials; ++i) { if (!mmd->materials[i].texture) continue; if (!(texturePath = _glhckImportTexturePath(mmd->materials[i].texture, file))) continue; if ((texture = glhckTextureNewFromFile(texturePath, NULL, NULL))) { glhckAtlasInsertTexture(atlas, texture); glhckTextureFree(texture); textureList[i] = texture; } _glhckFree(texturePath); } for (i = 0; i < mmd->num_materials && !textureList[i]; ++i); if (i >= mmd->num_materials) { /* no textures found */ NULLDO(glhckAtlasFree, atlas); NULLDO(_glhckFree, textureList); } else { /* pack textures */ if (glhckAtlasPack(atlas, GLHCK_RGBA, 1, 0, glhckTextureDefaultParameters()) != RETURN_OK) goto fail; } /* assign data */ for (i = 0, start = 0; i < mmd->num_materials; ++i, start += numFaces) { numFaces = mmd->materials[i].face; for (i2 = start; i2 < start + numFaces; ++i2) { ix = mmd->indices[i2]; /* vertices */ vertexData[ix].vertex.x = mmd->vertices[ix*3+0]; vertexData[ix].vertex.y = mmd->vertices[ix*3+1]; vertexData[ix].vertex.z = mmd->vertices[ix*3+2]; /* normals */ vertexData[ix].normal.x = mmd->normals[ix*3+0]; vertexData[ix].normal.y = mmd->normals[ix*3+1]; vertexData[ix].normal.z = mmd->normals[ix*3+2]; /* texture coords */ vertexData[ix].coord.x = mmd->coords[ix*2+0]; vertexData[ix].coord.y = mmd->coords[ix*2+1] * -1; /* fix coords */ if (vertexData[ix].coord.x < 0.0f) vertexData[ix].coord.x += 1.0f; if (vertexData[ix].coord.y < 0.0f) vertexData[ix].coord.y += 1.0f; /* if there is packed texture */ if (atlas && textureList[i]) { kmVec2 coord; coord.x = vertexData[ix].coord.x; coord.y = vertexData[ix].coord.y; glhckAtlasTransformCoordinates(atlas, textureList[i], &coord, &coord); vertexData[ix].coord.x = coord.x; vertexData[ix].coord.y = coord.y; } indices[i2] = ix; } } if (atlas) { if (!(material = glhckMaterialNew(glhckAtlasGetTexture(atlas)))) goto mmd_no_memory; glhckObjectMaterial(object, material); NULLDO(glhckMaterialFree, material); NULLDO(glhckAtlasFree, atlas); NULLDO(_glhckFree, textureList); } /* triangle strip geometry */ if (!(stripIndices = _glhckTriStrip(indices, mmd->num_indices, &numIndices))) { /* failed, use non stripped geometry */ geometryType = GLHCK_TRIANGLES; numIndices = mmd->num_indices; stripIndices = indices; } else NULLDO(_glhckFree, indices); /* set geometry */ glhckObjectInsertIndices(object, itype, stripIndices, numIndices); glhckObjectInsertVertices(object, vtype, vertexData, mmd->num_vertices); object->geometry->type = geometryType; /* finish */ NULLDO(_glhckFree, vertexData); NULLDO(_glhckFree, stripIndices); NULLDO(mmd_free, mmd); RET(0, "%d", RETURN_OK); return RETURN_OK; read_fail: DEBUG(GLHCK_DBG_ERROR, "Failed to open: %s", file); goto fail; mmd_import_fail: DEBUG(GLHCK_DBG_ERROR, "MMD importing failed."); goto fail; mmd_no_memory: DEBUG(GLHCK_DBG_ERROR, "MMD not enough memory."); fail: IFDO(fclose, f); IFDO(glhckAtlasFree, atlas); IFDO(mmd_free, mmd); IFDO(_glhckFree, textureList); IFDO(_glhckFree, vertexData); IFDO(_glhckFree, indices); IFDO(_glhckFree, stripIndices); RET(0, "%d", RETURN_FAIL); return RETURN_FAIL; }
void UfoLaser::init() { TEXTURE = glhckTextureNewFromFile(IMAGE.data(), nullptr, nullptr); }
void Shot::init() { TEXTURE = glhckTextureNewFromFile(IMAGE.data(), nullptr, glhckTextureDefaultSpriteParameters()); }