void geUpdateMatrix(){ ge_matrix_update[ge_current_mode] = ge_current_matrix_update; CalculateModelMatrices(); geSendMatrix(GE_MATRIX_MODEL, (float*)&ge_matrices[GE_MATRIX_MODEL]); geSendMatrix(GE_MATRIX_SUBMODEL, (float*)&ge_matrices[GE_MATRIX_SUBMODEL]); geSendMatrix(GE_MATRIX_VIEW, (float*)&ge_matrices[GE_MATRIX_VIEW]); geSendMatrix(GE_MATRIX_PROJECTION, (float*)&ge_matrices[GE_MATRIX_PROJECTION]); // if(ge_matrix_update[GE_MATRIX_MODEL] || ge_matrix_update[GE_MATRIX_VIEW]){ SendModelMatrices(); // } geSendMatrix(GE_MATRIX_TEXTURE0, (float*)&ge_matrices[GE_MATRIX_TEXTURE0]); geSendMatrix(GE_MATRIX_TEXTURE1, (float*)&ge_matrices[GE_MATRIX_TEXTURE1]); geSendMatrix(GE_MATRIX_TEXTURE2, (float*)&ge_matrices[GE_MATRIX_TEXTURE2]); geSendMatrix(GE_MATRIX_TEXTURE3, (float*)&ge_matrices[GE_MATRIX_TEXTURE3]); geSendMatrix(GE_MATRIX_TEXTURE4, (float*)&ge_matrices[GE_MATRIX_TEXTURE4]); geSendMatrix(GE_MATRIX_TEXTURE5, (float*)&ge_matrices[GE_MATRIX_TEXTURE5]); geSendMatrix(GE_MATRIX_TEXTURE6, (float*)&ge_matrices[GE_MATRIX_TEXTURE6]); geSendMatrix(GE_MATRIX_TEXTURE7, (float*)&ge_matrices[GE_MATRIX_TEXTURE7]); glActiveTexture(GL_TEXTURE0); if(!ge_current_shader)return; GLdouble cp[4] = { ge_clip_plane[0], ge_clip_plane[1], ge_clip_plane[2], ge_clip_plane[3] }; glClipPlane(GL_CLIP_PLANE0, cp); }
void geSceneUpdateMatrices(ge_Scene* scene){ CalculateModelMatrices(); /* int i = 0; for(i=0; i<scene->nRenderers; i++){ geShaderUse(scene->renderers[i].shader); if(ge_current_camera){ glUniform3f(scene->renderers[i].shader->loc_camera, ge_current_camera->x, ge_current_camera->y, ge_current_camera->z); } geUpdateMatrix(); geShaderUse(NULL); } */ }
void geSceneDraw(ge_Scene* scene){ current_scene = scene; int i = 0; int j = 0; CalculateModelMatrices(); if(scene->sky.animator){ geRendererUse(&scene->sky); geShaderUniform1f(scene->sky.depth_enabled, ((float)geGetTick())/1000.0); geMatrixMode(GE_MATRIX_MODEL); geLoadIdentity(); geUpdateMatrix(); for(i=0; i< scene->sky.nObjs; i++){ glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, scene->sky.objs[i]->material.textures[0]->id); if(scene->sky.objs[i]->material.textures[1]){ glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, scene->sky.objs[i]->material.textures[1]->id); // geShaderUniform1i(geShaderUniformID(scene->sky.shader, "ge_Texture1"), 1); } glDrawArrays(GL_TRIANGLES, scene->sky.objs[i]->vert_start, scene->sky.objs[i]->nVerts); } } if(scene->cloudsGenerator){ // DrawClouds(scene); } float time = ((float)geGetTick()) / 1000.0; for(i=0; i<scene->nRenderers; i++){ if(scene->renderers[i].enabled && scene->renderers[i].extension){ if(((ge_type32_struct*)scene->renderers[i].extension)->type == GE_RENDERER_WATER){ geWaterRender(&scene->renderers[i], ge_current_camera, (void(*)(void*))geSceneDraw, scene); } } } for(i=0; i<scene->nRenderers; i++){ if(scene->renderers[i].enabled == false)continue; ge_Shader* fforce = NULL; if(scene->render_mode == GE_SCENE_RENDER_SHADOW && scene->renderers[i].shadow_shader){ fforce = geForceShader(scene->renderers[i].shadow_shader); } /* if(scene->renderers[i].matrix_used){ geMatrixMode(GE_MATRIX_PROJECTION); geLoadMatrix(scene->renderers[i].projection_matrix); }else{ geMatrixMode(GE_MATRIX_PROJECTION); geLoadMatrix(libge_context->projection_matrix); } */ geShaderUse(scene->renderers[i].shader); glUniform1f(scene->renderers[i].shader->loc_time, time); glUniform1f(scene->renderers[i].shader->loc_ratio, ((float)libge_context->width) / ((float)libge_context->height)); if(scene->fogEnabled){ glUniform1f(scene->renderers[i].shader->loc_fog_density, scene->fog->density); glUniform4f(scene->renderers[i].shader->loc_fog_color, scene->fog->color[0], scene->fog->color[1], scene->fog->color[2], scene->fog->color[3]); glUniform1f(scene->renderers[i].shader->loc_fog_start, scene->fog->start); glUniform1f(scene->renderers[i].shader->loc_fog_end, scene->fog->end); } if(scene->renderers[i].ext_func){ scene->renderers[i].ext_func(&scene->renderers[i], -1); } geRendererUpdate(&scene->renderers[i]); if(ge_current_camera){ glUniform3f(scene->renderers[i].shader->loc_camera, ge_current_camera->x, ge_current_camera->y, ge_current_camera->z); } geRenderObjects(&scene->renderers[i]); if(scene->renderers[i].callback){ scene->renderers[i].callback(&scene->renderers[i], -1); } if(scene->render_mode == GE_SCENE_RENDER_SHADOW && scene->renderers[i].shadow_shader && fforce){ geForceShader(fforce); } } }
void geSceneDraw(ge_Scene* scene){ current_scene = scene; int i = 0; int j = 0; CalculateModelMatrices(); /* if(scene->sky.animator){ geRendererUse(&scene->sky); geShaderUniform1f(scene->sky.depth_enabled, ((float)geGetTick())/1000.0); geMatrixMode(GE_MATRIX_MODEL); geLoadIdentity(); geUpdateMatrix(); for(i=0; i< scene->sky.nObjs; i++){ glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, scene->sky.objs[i]->material.textures[0]->id); if(scene->sky.objs[i]->material.textures[1]){ glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, scene->sky.objs[i]->material.textures[1]->id); // geShaderUniform1i(geShaderUniformID(scene->sky.shader, "ge_Texture1"), 1); } glDrawArrays(GL_TRIANGLES, scene->sky.objs[i]->vert_start, scene->sky.objs[i]->nVerts); } } */ if(scene->cloudsGenerator){ } float time = ((float)geGetTick()) / 1000.0; for(i=0; i<scene->nRenderers; i++){ if(scene->renderers[i].enabled == false)continue; if(scene->renderers[i].matrix_used){ geMatrixMode(GE_MATRIX_PROJECTION); geLoadMatrix(scene->renderers[i].projection_matrix); }else{ geMatrixMode(GE_MATRIX_PROJECTION); geLoadMatrix(libge_context->projection_matrix); } geShaderUse(scene->renderers[i].shader); glUniform1f(scene->renderers[i].shader->loc_time, time); glUniform1f(scene->renderers[i].shader->loc_ratio, ((float)libge_context->width) / ((float)libge_context->height)); if(scene->fogEnabled){ glUniform1f(scene->renderers[i].shader->loc_fog_density, scene->fog->density); glUniform4f(scene->renderers[i].shader->loc_fog_color, scene->fog->color[0], scene->fog->color[1], scene->fog->color[2], scene->fog->color[3]); glUniform1f(scene->renderers[i].shader->loc_fog_start, scene->fog->start); glUniform1f(scene->renderers[i].shader->loc_fog_end, scene->fog->end); } /* if(scene->renderers[i].depth_enabled){ glEnable(GL_DEPTH_TEST); }else{ glDisable(GL_DEPTH_TEST); } if(scene->renderers[i].blend_enabled){ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }else{ glDisable(GL_BLEND); } */ if(scene->renderers[i].ext_func){ scene->renderers[i].ext_func(&scene->renderers[i], -1); } StaticLightingFunc2(scene, &scene->renderers[i], -1); for(j=0; j<scene->nDynamicLights; j++){ glUniform4f(scene->renderers[i].shader->loc_lights[j].loc_position, scene->dynamicLights[j].position.x, scene->dynamicLights[j].position.y, scene->dynamicLights[j].position.z, scene->dynamicLights[j].position.w); glUniform4f(scene->renderers[i].shader->loc_lights[j].loc_target, scene->dynamicLights[j].target.x, scene->dynamicLights[j].target.y, scene->dynamicLights[j].target.z, scene->dynamicLights[j].target.w); glUniform4f(scene->renderers[i].shader->loc_lights[j].loc_ambient, scene->dynamicLights[j].ambient[0], scene->dynamicLights[j].ambient[1], scene->dynamicLights[j].ambient[2], scene->dynamicLights[j].ambient[3]); glUniform4f(scene->renderers[i].shader->loc_lights[j].loc_diffuse, scene->dynamicLights[j].diffuse[0], scene->dynamicLights[j].diffuse[1], scene->dynamicLights[j].diffuse[2], scene->dynamicLights[j].diffuse[3]); glUniform4f(scene->renderers[i].shader->loc_lights[j].loc_specular, scene->dynamicLights[j].specular[0], scene->dynamicLights[j].specular[1], scene->dynamicLights[j].specular[2], scene->dynamicLights[j].specular[3]); glUniform1f(scene->renderers[i].shader->loc_lights[j].loc_attenuation, scene->dynamicLights[j].attenuation); glUniform1f(scene->renderers[i].shader->loc_lights[j].loc_spotCutoff, scene->dynamicLights[j].spot_cutoff); glUniform1f(scene->renderers[i].shader->loc_lights[j].loc_spotCosCutoff, scene->dynamicLights[j].spot_coscutoff); glUniform1f(scene->renderers[i].shader->loc_lights[j].loc_spotExponent, scene->dynamicLights[j].spot_exponent); } for(j=0; j<scene->nLights; j++){ glUniform4f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_position, scene->lights[j].position.x, scene->lights[j].position.y, scene->lights[j].position.z, scene->lights[j].position.w); glUniform4f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_target, scene->lights[j].target.x, scene->lights[j].target.y, scene->lights[j].target.z, scene->lights[j].target.w); glUniform4f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_ambient, scene->lights[j].ambient[0], scene->lights[j].ambient[1], scene->lights[j].ambient[2], scene->lights[j].ambient[3]); glUniform4f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_diffuse, scene->lights[j].diffuse[0], scene->lights[j].diffuse[1], scene->lights[j].diffuse[2], scene->lights[j].diffuse[3]); glUniform4f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_specular, scene->lights[j].specular[0], scene->lights[j].specular[1], scene->lights[j].specular[2], scene->lights[j].specular[3]); if(!scene->lights[j].used){ glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_attenuation, -1.0); }else if(scene->lights[j].type != GE_LIGHT_TYPE_SPOT){ glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_attenuation, -2.0); }else{ glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_attenuation, scene->lights[j].attenuation); } glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_spotCutoff, scene->lights[j].spot_cutoff); glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_spotCosCutoff, scene->lights[j].spot_coscutoff); glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_spotExponent, scene->lights[j].spot_exponent); glUniform3f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_vector, scene->lights[j].vector.x, scene->lights[j].vector.y, scene->lights[j].vector.z); glUniform3f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_targetVector, scene->lights[j].target_vector.x, scene->lights[j].target_vector.y, scene->lights[j].target_vector.z); glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_CosInnerMinusOuterAngle, scene->lights[j].CosInnerMinusOuterAngle); glUniform1f(scene->renderers[i].shader->loc_lights[j+8/*j+scene->nDynamicLights*/].loc_CosOuterConeAngle, scene->lights[j].CosOuterConeAngle); } if(ge_current_camera){ glUniform3f(scene->renderers[i].shader->loc_camera, ge_current_camera->x, ge_current_camera->y, ge_current_camera->z); } geRenderObjects(&scene->renderers[i]); if(scene->renderers[i].callback){ scene->renderers[i].callback(&scene->renderers[i], -1); } } }