From 278c6d59265b9f44f410992b395c880676b3dbf2 Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 10 Oct 2012 22:09:28 +0000 Subject: [PATCH] Completed implementation of skyboxes, enabled by setting the "skybox" attribute of the "scene" node. Once the camera is moved to the scene graph, this "skybox" attribute will be moved to the "camera" nodes. --HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%40125 --- KREngine/KREngine.xcodeproj/project.pbxproj | 18 +- KREngine/KREngine/Classes/KRCamera.cpp | 46 ++++- KREngine/KREngine/Classes/KRCamera.h | 6 + KREngine/KREngine/Classes/KRNode.cpp | 3 - KREngine/KREngine/Classes/KRPointLight.cpp | 6 - KREngine/KREngine/Classes/KRScene.cpp | 11 +- KREngine/KREngine/Classes/KRScene.h | 3 +- KREngine/KREngine/Classes/KRShader.cpp | 26 +++ KREngine/KREngine/Classes/KRShader.h | 2 + KREngine/KREngine/Classes/KRSkyBox.cpp | 163 ------------------ KREngine/KREngine/Classes/KRSkyBox.h | 53 ------ KREngine/KREngine/Classes/KRTexture.cpp | 16 +- KREngine/KREngine/Classes/KRTexture.h | 11 +- KREngine/KREngine/Classes/KRTexture2D.cpp | 23 ++- KREngine/KREngine/Classes/KRTexture2D.h | 5 +- KREngine/KREngine/Classes/KRTextureCube.cpp | 16 +- KREngine/KREngine/Classes/KRTextureCube.h | 10 +- .../KREngine/Classes/KRTextureManager.cpp | 22 +-- KREngine/KREngine/Classes/KRTextureManager.h | 8 +- KREngine/KREngine/Shaders/sky_box.fsh | 38 ++++ KREngine/KREngine/Shaders/sky_box.vsh | 49 ++++++ 21 files changed, 250 insertions(+), 285 deletions(-) delete mode 100644 KREngine/KREngine/Classes/KRSkyBox.cpp delete mode 100644 KREngine/KREngine/Classes/KRSkyBox.h create mode 100644 KREngine/KREngine/Shaders/sky_box.fsh create mode 100644 KREngine/KREngine/Shaders/sky_box.vsh diff --git a/KREngine/KREngine.xcodeproj/project.pbxproj b/KREngine/KREngine.xcodeproj/project.pbxproj index fcbeb88..f6c1329 100644 --- a/KREngine/KREngine.xcodeproj/project.pbxproj +++ b/KREngine/KREngine.xcodeproj/project.pbxproj @@ -7,8 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 1000469D15E6EF550053B072 /* KRSkyBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1000469B15E6EF550053B072 /* KRSkyBox.cpp */; }; - 1000469E15E6EF550053B072 /* KRSkyBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 1000469C15E6EF550053B072 /* KRSkyBox.h */; }; E4030E4C160A3CF000592648 /* KRStockGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = E4030E4B160A3CF000592648 /* KRStockGeometry.h */; }; E4030E4D160A3CF000592648 /* KRStockGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = E4030E4B160A3CF000592648 /* KRStockGeometry.h */; }; E40BA45415EFF79500D7C3DD /* KRAABB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40BA45215EFF79500D7C3DD /* KRAABB.cpp */; }; @@ -21,6 +19,8 @@ E414BAE91435585A00A668C4 /* KRScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAE81435585A00A668C4 /* KRScene.cpp */; }; E414BAEB14355E5500A668C4 /* KRBoundingVolume.h in Headers */ = {isa = PBXBuildFile; fileRef = E414BAEA14355E5500A668C4 /* KRBoundingVolume.h */; }; E414BAED14355EFF00A668C4 /* KRBoundingVolume.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAEC14355EFF00A668C4 /* KRBoundingVolume.cpp */; }; + E41B841E16260C5600C7A771 /* sky_box.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E41B841D16260C5600C7A771 /* sky_box.fsh */; }; + E41B842116260C6500C7A771 /* sky_box.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E41B842016260C6500C7A771 /* sky_box.vsh */; }; E42CB1EC158446940066E0D8 /* KRQuaternion.h in Headers */ = {isa = PBXBuildFile; fileRef = E42CB1EB158446940066E0D8 /* KRQuaternion.h */; }; E42CB1ED158446940066E0D8 /* KRQuaternion.h in Headers */ = {isa = PBXBuildFile; fileRef = E42CB1EB158446940066E0D8 /* KRQuaternion.h */; }; E42CB1F0158446AB0066E0D8 /* KRQuaternion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42CB1EF158446AB0066E0D8 /* KRQuaternion.cpp */; }; @@ -125,7 +125,6 @@ E497B95F151BF09600D3DC67 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E497B95E151BF09600D3DC67 /* SystemConfiguration.framework */; }; E4AFC6B615F7C46800DDB4C8 /* KRAABB.cpp in Headers */ = {isa = PBXBuildFile; fileRef = E40BA45215EFF79500D7C3DD /* KRAABB.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; E4AFC6B915F7C7B200DDB4C8 /* KROctree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4924C2415EE95E700B965C6 /* KROctree.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; - E4AFC6BA15F7C7C300DDB4C8 /* KRSkyBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1000469B15E6EF550053B072 /* KRSkyBox.cpp */; }; E4AFC6BB15F7C7D600DDB4C8 /* KROctreeNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4924C2915EE96AA00B965C6 /* KROctreeNode.cpp */; }; E4AFC6BC15F7C95D00DDB4C8 /* KRSceneManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E46C214915364DDB009CABF3 /* KRSceneManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4AFC6BD15F7C9DA00DDB4C8 /* KROctree.h in Headers */ = {isa = PBXBuildFile; fileRef = E4924C2515EE95E800B965C6 /* KROctree.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -192,8 +191,6 @@ /* End PBXBuildRule section */ /* Begin PBXFileReference section */ - 1000469B15E6EF550053B072 /* KRSkyBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRSkyBox.cpp; path = Classes/KRSkyBox.cpp; sourceTree = ""; }; - 1000469C15E6EF550053B072 /* KRSkyBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRSkyBox.h; path = Classes/KRSkyBox.h; sourceTree = ""; }; E4030E4B160A3CF000592648 /* KRStockGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRStockGeometry.h; path = Classes/KRStockGeometry.h; sourceTree = ""; }; E40BA45215EFF79500D7C3DD /* KRAABB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRAABB.cpp; path = Classes/KRAABB.cpp; sourceTree = ""; }; E40BA45315EFF79500D7C3DD /* KRAABB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRAABB.h; path = Classes/KRAABB.h; sourceTree = ""; }; @@ -203,6 +200,8 @@ E414BAE81435585A00A668C4 /* KRScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = KRScene.cpp; path = Classes/KRScene.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; E414BAEA14355E5500A668C4 /* KRBoundingVolume.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = KRBoundingVolume.h; path = Classes/KRBoundingVolume.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; E414BAEC14355EFF00A668C4 /* KRBoundingVolume.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = KRBoundingVolume.cpp; path = Classes/KRBoundingVolume.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + E41B841D16260C5600C7A771 /* sky_box.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sky_box.fsh; path = Shaders/sky_box.fsh; sourceTree = ""; }; + E41B842016260C6500C7A771 /* sky_box.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sky_box.vsh; path = Shaders/sky_box.vsh; sourceTree = ""; }; E42CB1EB158446940066E0D8 /* KRQuaternion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRQuaternion.h; path = Classes/KRQuaternion.h; sourceTree = ""; }; E42CB1EF158446AB0066E0D8 /* KRQuaternion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRQuaternion.cpp; path = Classes/KRQuaternion.cpp; sourceTree = ""; }; E430D08015F8882F0010558D /* occlusion_test.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = occlusion_test.fsh; path = Shaders/occlusion_test.fsh; sourceTree = ""; }; @@ -361,6 +360,8 @@ E48839A015F92C2800BD66D5 /* visualize_overlay.fsh */, E4CE184C15FF124600F80870 /* light_point_inside.fsh */, E4CE184E15FF125700F80870 /* light_point_inside.vsh */, + E41B841D16260C5600C7A771 /* sky_box.fsh */, + E41B842016260C6500C7A771 /* sky_box.vsh */, ); name = Shaders; sourceTree = ""; @@ -514,8 +515,6 @@ E461A171152E599E00F2044A /* Lights */, E4F975311536220900FD60B2 /* KRNode.h */, E4F975351536221C00FD60B2 /* KRNode.cpp */, - 1000469C15E6EF550053B072 /* KRSkyBox.h */, - 1000469B15E6EF550053B072 /* KRSkyBox.cpp */, ); name = "Scene Graph Nodes"; sourceTree = ""; @@ -684,7 +683,6 @@ E43B0AD815DDCA0F00A5CB9F /* KRContextObject.h in Headers */, E4924C2715EE95E800B965C6 /* KROctree.h in Headers */, E4924C2C15EE96AB00B965C6 /* KROctreeNode.h in Headers */, - 1000469E15E6EF550053B072 /* KRSkyBox.h in Headers */, E40BA45615EFF79500D7C3DD /* KRAABB.h in Headers */, E488399615F928CA00BD66D5 /* KRBundle.h in Headers */, E488399E15F92BE000BD66D5 /* KRBundleManager.h in Headers */, @@ -857,7 +855,6 @@ E43B0AD615DDCA0F00A5CB9F /* KRContextObject.cpp in Sources */, E4924C2615EE95E800B965C6 /* KROctree.cpp in Sources */, E4924C2B15EE96AB00B965C6 /* KROctreeNode.cpp in Sources */, - 1000469D15E6EF550053B072 /* KRSkyBox.cpp in Sources */, E40BA45415EFF79500D7C3DD /* KRAABB.cpp in Sources */, E430D08115F8882F0010558D /* occlusion_test.fsh in Sources */, E430D08915F88AD10010558D /* occlusion_test.vsh in Sources */, @@ -868,6 +865,8 @@ E4CE184F15FF125700F80870 /* light_point_inside.vsh in Sources */, E4B175AC161F5A1000B8FB80 /* KRTexture.cpp in Sources */, E4B175B2161F5FAF00B8FB80 /* KRTextureCube.cpp in Sources */, + E41B841E16260C5600C7A771 /* sky_box.fsh in Sources */, + E41B842116260C6500C7A771 /* sky_box.vsh in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -904,7 +903,6 @@ E48C697315374F7E00232E28 /* KRContext.cpp in Sources */, E46A6B6D1559E97D000DBD37 /* KRResource+blend.cpp in Sources */, E46F4A05155DF47C00CCF8B8 /* KRWorld.cpp in Sources */, - E4AFC6BA15F7C7C300DDB4C8 /* KRSkyBox.cpp in Sources */, E46F4A0F155E003000CCF8B8 /* KRDataBlock.cpp in Sources */, E42CB1F1158446AB0066E0D8 /* KRQuaternion.cpp in Sources */, E4AFC6BB15F7C7D600DDB4C8 /* KROctreeNode.cpp in Sources */, diff --git a/KREngine/KREngine/Classes/KRCamera.cpp b/KREngine/KREngine/Classes/KRCamera.cpp index 2ae0980..41a3381 100644 --- a/KREngine/KREngine/Classes/KRCamera.cpp +++ b/KREngine/KREngine/Classes/KRCamera.cpp @@ -101,6 +101,9 @@ KRCamera::KRCamera(KRContext &context, GLint width, GLint height) : KRContextObj m_iFrame = 0; + m_skyBoxName = ""; + m_pSkyBoxTexture = NULL; + createBuffers(); } @@ -368,7 +371,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE, newVisibleBounds); } - // ----====---- Transparent Geometry, Forward Rendering ----====---- + // ----====---- Sky Box ----====---- // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); @@ -385,6 +388,42 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD GLDEBUG(glDepthFunc(GL_LEQUAL)); GLDEBUG(glDepthRangef(0.0, 1.0)); + if(!m_pSkyBoxTexture && m_skyBoxName.length()) { + m_pSkyBoxTexture = getContext().getTextureManager()->getTextureCube(m_skyBoxName.c_str()); + } + + if(m_pSkyBoxTexture) { + KRMat4 mvpMatrix = viewMatrix * getProjectionMatrix(); + KRShader *pShader = getContext().getShaderManager()->getShader("sky_box", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_OPAQUE); + pShader->bind(this, viewMatrix, mvpMatrix, lightDirection, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_OPAQUE); + + getContext().getTextureManager()->selectTexture(0, m_pSkyBoxTexture, 2048); + + // Render a full screen quad + m_pContext->getModelManager()->bindVBO((void *)KRENGINE_VBO_2D_SQUARE, KRENGINE_VBO_2D_SQUARE_SIZE, true, false, false, true, false); + GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); + } + + + // ----====---- Transparent Geometry, Forward Rendering ----====---- + +// Note: These parameters have already been set up by the skybox render above +// +// // Set render target +// GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); +// GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); +// +// // Disable backface culling +// GLDEBUG(glDisable(GL_CULL_FACE)); +// +// // Disable z-buffer write +// GLDEBUG(glDepthMask(GL_FALSE)); +// +// // Enable z-buffer test +// GLDEBUG(glEnable(GL_DEPTH_TEST)); +// GLDEBUG(glDepthFunc(GL_LEQUAL)); +// GLDEBUG(glDepthRangef(0.0, 1.0)); + // Enable alpha blending GLDEBUG(glEnable(GL_BLEND)); GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); @@ -779,3 +818,8 @@ void KRCamera::invalidateShadowBuffers() { shadowValid[i] = false; } } + +void KRCamera::setSkyBox(const std::string &skyBoxName) { + m_pSkyBoxTexture = NULL; + m_skyBoxName = skyBoxName; +} diff --git a/KREngine/KREngine/Classes/KRCamera.h b/KREngine/KREngine/Classes/KRCamera.h index 7d6ab6c..4e3fb88 100644 --- a/KREngine/KREngine/Classes/KRCamera.h +++ b/KREngine/KREngine/Classes/KRCamera.h @@ -39,6 +39,7 @@ #import "KRAABB.h" #import "KRShader.h" #import "KRContextObject.h" +#import "KRTexture.h" #define KRENGINE_MAX_SHADOW_BUFFERS 3 @@ -111,6 +112,8 @@ public: int m_cShadowBuffers; std::string m_debug_text; + + void setSkyBox(const std::string &skyBoxName); private: KRVector3 m_position; @@ -158,6 +161,9 @@ private: std::set m_visibleBounds; // AABB's that output fragments in the last frame std::set m_shadowVisibleBounds[KRENGINE_MAX_SHADOW_BUFFERS]; // AABB's that output fragments in the last frame for each shadow map + std::string m_skyBoxName; + KRTexture *m_pSkyBoxTexture; + }; #endif diff --git a/KREngine/KREngine/Classes/KRNode.cpp b/KREngine/KREngine/Classes/KRNode.cpp index ed4fe71..a347c30 100644 --- a/KREngine/KREngine/Classes/KRNode.cpp +++ b/KREngine/KREngine/Classes/KRNode.cpp @@ -15,7 +15,6 @@ #import "KRSpotLight.h" #import "KRDirectionalLight.h" #import "KRInstance.h" -#import "KRSkyBox.h" #import "KRAABB.h" @@ -143,8 +142,6 @@ KRNode *KRNode::LoadXML(KRScene &scene, tinyxml2::XMLElement *e) { lod_min_coverage = 0.0f; //1.0f / 1024.0f / 768.0f; // FINDME - HACK - Need to dynamically select the absolute minimum based on the render buffer size } new_node = new KRInstance(scene, szName, szName, e->Attribute("light_map"), lod_min_coverage); - } else if(strcmp(szElementName, "sky_box") == 0) { - new_node = new KRSkyBox(scene, szName); } if(new_node) { diff --git a/KREngine/KREngine/Classes/KRPointLight.cpp b/KREngine/KREngine/Classes/KRPointLight.cpp index 8ba1658..0a54418 100644 --- a/KREngine/KREngine/Classes/KRPointLight.cpp +++ b/KREngine/KREngine/Classes/KRPointLight.cpp @@ -126,12 +126,6 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMa GLDEBUG(glUniformMatrix4fv(pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_M2V], 1, GL_FALSE, matModelToView2.getPointer())); - KRMat4 matInvProjection; - matInvProjection = pCamera->getProjectionMatrix(); - matInvProjection.invert(); - GLDEBUG(glUniformMatrix4fv(pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_INVP], 1, GL_FALSE, matInvProjection.getPointer())); - - if(bVisualize) { // Enable additive blending GLDEBUG(glEnable(GL_BLEND)); diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index 123e8cb..deef20e 100644 --- a/KREngine/KREngine/Classes/KRScene.cpp +++ b/KREngine/KREngine/Classes/KRScene.cpp @@ -48,6 +48,7 @@ KRScene::KRScene(KRContext &context, std::string name) : KRResource(context, nam sun_yaw = 4.333; // TODO - Remove temporary testing code sun_pitch = 0.55; + m_skyBoxName = ""; } KRScene::~KRScene() { delete m_pRootNode; @@ -59,6 +60,7 @@ KRScene::~KRScene() { void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visibleBounds, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds) { updateOctree(); + pCamera->setSkyBox(m_skyBoxName); // This is temporary until the camera is moved into the scene graph if(renderPass != KRNode::RENDER_PASS_SHADOWMAP) { @@ -309,8 +311,10 @@ KRNode *KRScene::getRootNode() { bool KRScene::save(const std::string& path) { tinyxml2::XMLDocument doc; - tinyxml2::XMLNode *scene_node = doc.InsertEndChild( doc.NewElement( "scene" )); + tinyxml2::XMLElement *scene_node = doc.NewElement( "scene" ); + doc.InsertEndChild(scene_node); m_pRootNode->saveXML(scene_node); + scene_node->SetAttribute("skybox", m_skyBoxName.c_str()); // This is temporary until the camera is moved into the scene graph doc.SaveFile(path.c_str()); return true; } @@ -339,7 +343,10 @@ KRScene *KRScene::Load(KRContext &context, const std::string &name, KRDataBlock doc.Parse((char *)data->getStart()); KRScene *new_scene = new KRScene(context, name); - KRNode *n = KRNode::LoadXML(*new_scene, doc.RootElement()->FirstChildElement()); + tinyxml2::XMLElement *scene_element = doc.RootElement(); + new_scene->m_skyBoxName = scene_element->Attribute("skybox"); // This is temporary until the camera is moved into the scene graph + + KRNode *n = KRNode::LoadXML(*new_scene, scene_element->FirstChildElement()); if(n) { new_scene->getRootNode()->addChild(n); } diff --git a/KREngine/KREngine/Classes/KRScene.h b/KREngine/KREngine/Classes/KRScene.h index 0996fe4..803b1f0 100644 --- a/KREngine/KREngine/Classes/KRScene.h +++ b/KREngine/KREngine/Classes/KRScene.h @@ -87,7 +87,8 @@ private: KROctree m_nodeTree; void updateOctree(); - + + std::string m_skyBoxName; }; diff --git a/KREngine/KREngine/Classes/KRShader.cpp b/KREngine/KREngine/Classes/KRShader.cpp index 2506c24..a14a62f 100644 --- a/KREngine/KREngine/Classes/KRShader.cpp +++ b/KREngine/KREngine/Classes/KRShader.cpp @@ -130,6 +130,8 @@ KRShader::KRShader(char *szKey, std::string options, std::string vertShaderSourc GLDEBUG(m_uniforms[KRENGINE_UNIFORM_MATERIAL_SHININESS] = glGetUniformLocation(m_iProgram, "material_shininess")); GLDEBUG(m_uniforms[KRENGINE_UNIFORM_MVP] = glGetUniformLocation(m_iProgram, "mvp_matrix")); GLDEBUG(m_uniforms[KRENGINE_UNIFORM_INVP] = glGetUniformLocation(m_iProgram, "inv_projection_matrix")); + GLDEBUG(m_uniforms[KRENGINE_UNIFORM_INVMVP] = glGetUniformLocation(m_iProgram, "inv_mvp_matrix")); + GLDEBUG(m_uniforms[KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE] = glGetUniformLocation(m_iProgram, "inv_mvp_matrix_no_translate")); GLDEBUG(m_uniforms[KRENGINE_UNIFORM_MN2V] = glGetUniformLocation(m_iProgram, "model_normal_to_view_matrix")); GLDEBUG(m_uniforms[KRENGINE_UNIFORM_M2V] = glGetUniformLocation(m_iProgram, "model_to_view_matrix")); GLDEBUG(m_uniforms[KRENGINE_UNIFORM_V2M] = glGetUniformLocation(m_iProgram, "view_to_model_matrix")); @@ -210,6 +212,30 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModelToView, KRMat4 &mvpMatrix // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram GLDEBUG(glUniformMatrix4fv(m_uniforms[KRENGINE_UNIFORM_MVP], 1, GL_FALSE, mvpMatrix.getPointer())); GLDEBUG(glUniformMatrix4fv(m_uniforms[KRENGINE_UNIFORM_MN2V], 1, GL_FALSE, matModelToView.getPointer())); + + + KRMat4 matInvProjection; + matInvProjection = pCamera->getProjectionMatrix(); + matInvProjection.invert(); + GLDEBUG(glUniformMatrix4fv(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP], 1, GL_FALSE, matInvProjection.getPointer())); + + KRMat4 matInvMVP = mvpMatrix; + matInvMVP.invert(); + GLDEBUG(glUniformMatrix4fv(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP], 1, GL_FALSE, matInvMVP.getPointer())); + + KRMat4 matInvMVPNoTranslate = matModelToView; + // Remove the translation + matInvMVPNoTranslate.getPointer()[3] = 0; + matInvMVPNoTranslate.getPointer()[7] = 0; + matInvMVPNoTranslate.getPointer()[11] = 0; + matInvMVPNoTranslate.getPointer()[12] = 0; + matInvMVPNoTranslate.getPointer()[13] = 0; + matInvMVPNoTranslate.getPointer()[14] = 0; + matInvMVPNoTranslate.getPointer()[15] = 1.0; + matInvMVPNoTranslate = matInvMVPNoTranslate * pCamera->getProjectionMatrix(); + matInvMVPNoTranslate.invert(); + GLDEBUG(glUniformMatrix4fv(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE], 1, GL_FALSE, matInvMVPNoTranslate.getPointer())); + KRVector3 nLightDir = lightDirection; diff --git a/KREngine/KREngine/Classes/KRShader.h b/KREngine/KREngine/Classes/KRShader.h index 0cb3465..a865d63 100644 --- a/KREngine/KREngine/Classes/KRShader.h +++ b/KREngine/KREngine/Classes/KRShader.h @@ -89,6 +89,8 @@ public: KRENGINE_UNIFORM_MVP, KRENGINE_UNIFORM_INVP, + KRENGINE_UNIFORM_INVMVP, + KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE, KRENGINE_UNIFORM_MN2V, KRENGINE_UNIFORM_M2V, KRENGINE_UNIFORM_V2M, diff --git a/KREngine/KREngine/Classes/KRSkyBox.cpp b/KREngine/KREngine/Classes/KRSkyBox.cpp deleted file mode 100644 index ed3c7a3..0000000 --- a/KREngine/KREngine/Classes/KRSkyBox.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// -// KRSkyBox.cpp -// KREngine -// -// Created by Michael Ilich on 2012-08-23. -// Copyright (c) 2012 Kearwood Software. All rights reserved. -// - -#include - -#include "KRSkyBox.h" -#import "KRShader.h" -#import "KRContext.h" -#import "KRMat4.h" -#import "KRResource.h" -#import "KRContext.h" -#import "KRStockGeometry.h" - -KRSkyBox::KRSkyBox(KRScene &scene, std::string name) : KRNode(scene, name) -{ - m_frontTexture = ""; - m_backTexture = ""; - m_topTexture = ""; - m_bottomTexture = ""; - m_leftTexture = ""; - m_rightTexture = ""; - - m_pFrontTexture = NULL; - m_pBackTexture = NULL; - m_pTopTexture = NULL; - m_pBottomTexture = NULL; - m_pLeftTexture = NULL; - m_pRightTexture = NULL; - -} - -KRSkyBox::~KRSkyBox() -{ - -} - -std::string KRSkyBox::getElementName() { - return "sky_box"; -} - -void KRSkyBox::loadXML(tinyxml2::XMLElement *e) { - KRNode::loadXML(e); - - const char *szFrontTexture = e->Attribute("front_texture"); - if(szFrontTexture) { - m_frontTexture = szFrontTexture; - } else { - m_frontTexture = ""; - } - m_pFrontTexture = NULL; - - const char *szBackTexture = e->Attribute("back_texture"); - if(szBackTexture) { - m_backTexture = szBackTexture; - } else { - m_backTexture = ""; - } - m_pBackTexture = NULL; - - const char *szTopTexture = e->Attribute("top_texture"); - if(szTopTexture) { - m_topTexture = szTopTexture; - } else { - m_topTexture = ""; - } - m_pTopTexture = NULL; - - const char *szBottomTexture = e->Attribute("bottom_texture"); - if(szBottomTexture) { - m_bottomTexture = szBottomTexture; - } else { - m_bottomTexture = ""; - } - m_pBottomTexture = NULL; - - const char *szLeftTexture = e->Attribute("left_texture"); - if(szLeftTexture) { - m_leftTexture = szLeftTexture; - } else { - m_leftTexture = ""; - } - m_pLeftTexture = NULL; - - const char *szRightTexture = e->Attribute("right_texture"); - if(szRightTexture) { - m_rightTexture = szRightTexture; - } else { - m_rightTexture = ""; - } - m_pRightTexture = NULL; - -} - - -#if TARGET_OS_IPHONE - -void KRSkyBox::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRNode::RenderPass renderPass) { - -// KRNode::render(pCamera, pContext, frustrumVolume, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); - - if(renderPass == KRNode::RENDER_PASS_SKYBOX) { - // Skybox is rendered on the final pass of the deferred renderer - - if(m_frontTexture.size() && !m_pFrontTexture) { - m_pFrontTexture = pContext->getTextureManager()->getTexture(m_frontTexture.c_str()); - } - - if(m_backTexture.size() && !m_pBackTexture) { - m_pBackTexture = pContext->getTextureManager()->getTexture(m_backTexture.c_str()); - } - - if(m_topTexture.size() && !m_pTopTexture) { - m_pTopTexture = pContext->getTextureManager()->getTexture(m_topTexture.c_str()); - } - - if(m_bottomTexture.size() && !m_pBottomTexture) { - m_pBottomTexture = pContext->getTextureManager()->getTexture(m_bottomTexture.c_str()); - } - - if(m_leftTexture.size() && !m_pLeftTexture) { - m_pLeftTexture = pContext->getTextureManager()->getTexture(m_leftTexture.c_str()); - } - - if(m_rightTexture.size() && !m_pRightTexture) { - m_pRightTexture = pContext->getTextureManager()->getTexture(m_rightTexture.c_str()); - } - - KRMat4 projectionMatrix = pCamera->getProjectionMatrix(); - - KRMat4 mvpmatrix = m_modelMatrix * viewMatrix * projectionMatrix; - KRMat4 matModelToView = viewMatrix * m_modelMatrix; - matModelToView.transpose(); - matModelToView.invert(); - -// KRShader *pShader = pContext->getShaderManager()->getShader("sky_box", pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, renderPass); -// pShader->bind(pCamera, matModelToView, mvpmatrix, NULL, NULL, NULL, 0, renderPass); - - m_pContext->getTextureManager()->selectTexture(0, m_pFrontTexture, 2048); - m_pContext->getTextureManager()->selectTexture(1, m_pBackTexture, 2048); - m_pContext->getTextureManager()->selectTexture(2, m_pTopTexture, 2048); - m_pContext->getTextureManager()->selectTexture(3, m_pBottomTexture, 2048); - m_pContext->getTextureManager()->selectTexture(4, m_pLeftTexture, 2048); - m_pContext->getTextureManager()->selectTexture(5, m_pRightTexture, 2048); - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - - // Render a full screen quad - m_pContext->getModelManager()->bindVBO((void *)KRENGINE_VBO_2D_SQUARE, KRENGINE_VBO_2D_SQUARE_SIZE, true, false, false, true, false); - GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); - } -} - -#endif - diff --git a/KREngine/KREngine/Classes/KRSkyBox.h b/KREngine/KREngine/Classes/KRSkyBox.h deleted file mode 100644 index a699578..0000000 --- a/KREngine/KREngine/Classes/KRSkyBox.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// KRSkyBox.h -// KREngine -// -// Created by Michael Ilich on 2012-08-23. -// Copyright (c) 2012 Kearwood Software. All rights reserved. -// - -#ifndef __KREngine__KRSkyBox__ -#define __KREngine__KRSkyBox__ - -#include -#import "KRMat4.h" -#import "KRNode.h" -#import "KRTexture.h" - -class KRSkyBox : public KRNode { - -public: - - KRSkyBox(KRScene &scene, std::string name); - virtual ~KRSkyBox(); - - virtual std::string getElementName(); - virtual void loadXML(tinyxml2::XMLElement *e); - -#if TARGET_OS_IPHONE - - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRNode::RenderPass renderPass); -#endif - -private: - KRMat4 m_modelMatrix; - -protected: - std::string m_frontTexture; - std::string m_backTexture; - std::string m_topTexture; - std::string m_bottomTexture; - std::string m_leftTexture; - std::string m_rightTexture; - - KRTexture *m_pFrontTexture; - KRTexture *m_pBackTexture; - KRTexture *m_pTopTexture; - KRTexture *m_pBottomTexture; - KRTexture *m_pLeftTexture; - KRTexture *m_pRightTexture; - -}; - - -#endif \ No newline at end of file diff --git a/KREngine/KREngine/Classes/KRTexture.cpp b/KREngine/KREngine/Classes/KRTexture.cpp index cde014b..73a7245 100644 --- a/KREngine/KREngine/Classes/KRTexture.cpp +++ b/KREngine/KREngine/Classes/KRTexture.cpp @@ -19,36 +19,36 @@ KRTexture::KRTexture(KRContext &context) : KRContextObject(context) KRTexture::~KRTexture() { - long textureMemFreed = 0; + size_t textureMemFreed = 0; releaseHandle(textureMemFreed); } -void KRTexture::releaseHandle(long &textureMemUsed) { +void KRTexture::releaseHandle(size_t &textureMemUsed) { + textureMemUsed -= getMemSize(); if(m_iHandle != 0) { - textureMemUsed -= getMemSize(); GLDEBUG(glDeleteTextures(1, &m_iHandle)); m_iHandle = 0; m_textureMemUsed = 0; } + textureMemUsed += getMemSize(); } long KRTexture::getMemSize() { return m_textureMemUsed; // TODO - This is not 100% accurate, as loaded format may differ in size while in GPU memory } -GLuint KRTexture::getHandle(long &textureMemUsed, int max_dim, bool can_resize) { +GLuint KRTexture::getHandle(int max_dim, bool can_resize) { // Constrain target LOD to be within mipmap levels of texture int target_dim = max_dim; if(target_dim < m_min_lod_max_dim) target_dim = m_min_lod_max_dim; if(target_dim > m_max_lod_max_dim) target_dim = m_max_lod_max_dim; if(can_resize && m_current_lod_max_dim != target_dim) { - releaseHandle(textureMemUsed); + size_t memFreed = 0; + releaseHandle(memFreed); } if(m_iHandle == 0) { - if(createGLTexture(target_dim, m_textureMemUsed)) { - textureMemUsed += getMemSize(); - } else { + if(!createGLTexture(target_dim)) { assert(false); } } diff --git a/KREngine/KREngine/Classes/KRTexture.h b/KREngine/KREngine/Classes/KRTexture.h index fcbce35..535de79 100644 --- a/KREngine/KREngine/Classes/KRTexture.h +++ b/KREngine/KREngine/Classes/KRTexture.h @@ -45,18 +45,19 @@ public: KRTexture(KRContext &context); virtual ~KRTexture(); - GLuint getHandle(long &textureMemUsed, int max_dim, bool can_resize); - void releaseHandle(long &textureMemUsed); + virtual void bind(size_t &textureMemUsed, int max_dim, bool can_resize) = 0; + void releaseHandle(size_t &textureMemUsed); long getMemSize(); protected: - virtual bool createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) = 0; + virtual bool createGLTexture(int lod_max_dim) = 0; + GLuint getHandle(int max_dim, bool can_resize); - GLuint m_iHandle; - uint32_t m_textureMemUsed; + GLuint m_iHandle; + size_t m_textureMemUsed; int m_current_lod_max_dim; diff --git a/KREngine/KREngine/Classes/KRTexture2D.cpp b/KREngine/KREngine/Classes/KRTexture2D.cpp index 17d4fc9..7ce3a1e 100644 --- a/KREngine/KREngine/Classes/KRTexture2D.cpp +++ b/KREngine/KREngine/Classes/KRTexture2D.cpp @@ -171,7 +171,7 @@ bool KRTexture2D::load() { -bool KRTexture2D::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) { +bool KRTexture2D::createGLTexture(int lod_max_dim) { m_current_lod_max_dim = 0; GLDEBUG(glGenTextures(1, &m_iHandle)); if(m_iHandle == 0) { @@ -183,9 +183,8 @@ bool KRTexture2D::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) { } else { GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); } - if(!uploadTexture(GL_TEXTURE_2D, lod_max_dim, m_current_lod_max_dim, textureMemUsed)) { + if(!uploadTexture(GL_TEXTURE_2D, lod_max_dim, m_current_lod_max_dim, m_textureMemUsed)) { GLDEBUG(glDeleteTextures(1, &m_iHandle)); - textureMemUsed = 0; m_iHandle = 0; m_current_lod_max_dim = 0; return false; @@ -194,7 +193,7 @@ bool KRTexture2D::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) { return true; } -bool KRTexture2D::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, uint32_t &textureMemUsed) +bool KRTexture2D::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, size_t &textureMemUsed) { int width = m_iWidth; int height = m_iHeight; @@ -214,11 +213,9 @@ bool KRTexture2D::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod if(height > current_lod_max_dim) { current_lod_max_dim = height; } - GLDEBUG(glCompressedTexImage2D(target, i, m_internalFormat, width, height, 0, block.length, block.start)); - + glCompressedTexImage2D(target, i, m_internalFormat, width, height, 0, block.length, block.start); err = glGetError(); if (err != GL_NO_ERROR) { - return false; } textureMemUsed += block.length; @@ -239,5 +236,15 @@ bool KRTexture2D::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod } - +void KRTexture2D::bind(size_t &textureMemUsed, int max_dim, bool can_resize) { + textureMemUsed -= getMemSize(); + GLDEBUG(glBindTexture(GL_TEXTURE_2D, getHandle(max_dim, can_resize))); + + // TODO - These texture parameters should be assigned by the material or texture parameters + GLDEBUG(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f)); + GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)); + GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)); + + textureMemUsed += getMemSize(); +} diff --git a/KREngine/KREngine/Classes/KRTexture2D.h b/KREngine/KREngine/Classes/KRTexture2D.h index 66ff421..589737a 100644 --- a/KREngine/KREngine/Classes/KRTexture2D.h +++ b/KREngine/KREngine/Classes/KRTexture2D.h @@ -52,12 +52,13 @@ public: int getMaxMipMap(); int getMinMipMap(); - bool uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, uint32_t &textureMemUsed); + bool uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, size_t &textureMemUsed); + virtual void bind(size_t &textureMemUsed, int max_dim, bool can_resize); private: KRDataBlock *m_pData; - virtual bool createGLTexture(int lod_max_dim, uint32_t &textureMemUsed); + virtual bool createGLTexture(int lod_max_dim); uint32_t m_iWidth; diff --git a/KREngine/KREngine/Classes/KRTextureCube.cpp b/KREngine/KREngine/Classes/KRTextureCube.cpp index 2a12b1e..b2c08bb 100644 --- a/KREngine/KREngine/Classes/KRTextureCube.cpp +++ b/KREngine/KREngine/Classes/KRTextureCube.cpp @@ -54,7 +54,7 @@ KRTextureCube::~KRTextureCube() { } -bool KRTextureCube::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) +bool KRTextureCube::createGLTexture(int lod_max_dim) { m_current_lod_max_dim = 0; GLDEBUG(glGenTextures(1, &m_iHandle)); @@ -71,7 +71,7 @@ bool KRTextureCube::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) KRTexture2D *faceTexture = (KRTexture2D *)getContext().getTextureManager()->getTexture(faceName.c_str()); if(faceTexture) { if(faceTexture->hasMipmaps()) bMipMaps = true; - faceTexture->uploadTexture(TARGETS[i], lod_max_dim, m_current_lod_max_dim, textureMemUsed); + faceTexture->uploadTexture(TARGETS[i], lod_max_dim, m_current_lod_max_dim, m_textureMemUsed); } } @@ -82,3 +82,15 @@ bool KRTextureCube::createGLTexture(int lod_max_dim, uint32_t &textureMemUsed) } return true; } + + +void KRTextureCube::bind(size_t &textureMemUsed, int max_dim, bool can_resize) +{ + textureMemUsed -= getMemSize(); + + GLDEBUG(glBindTexture(GL_TEXTURE_CUBE_MAP, getHandle(max_dim, can_resize))); + GLDEBUG(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GLDEBUG(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + + textureMemUsed += getMemSize(); +} \ No newline at end of file diff --git a/KREngine/KREngine/Classes/KRTextureCube.h b/KREngine/KREngine/Classes/KRTextureCube.h index a1441b6..8502f82 100644 --- a/KREngine/KREngine/Classes/KRTextureCube.h +++ b/KREngine/KREngine/Classes/KRTextureCube.h @@ -39,15 +39,13 @@ public: KRTextureCube(KRContext &context, std::string name); virtual ~KRTextureCube(); + virtual void bind(size_t &textureMemUsed, int max_dim, bool can_resize); + private: - virtual bool createGLTexture(int lod_max_dim, uint32_t &textureMemUsed); + virtual bool createGLTexture(int lod_max_dim); std::string m_name; - - GLuint m_iHandle; - - uint32_t m_textureMemUsed; - + const GLenum TARGETS[6] = { GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, diff --git a/KREngine/KREngine/Classes/KRTextureManager.cpp b/KREngine/KREngine/Classes/KRTextureManager.cpp index 0854eeb..72e4f84 100644 --- a/KREngine/KREngine/Classes/KRTextureManager.cpp +++ b/KREngine/KREngine/Classes/KRTextureManager.cpp @@ -106,18 +106,15 @@ void KRTextureManager::selectTexture(int iTextureUnit, KRTexture *pTexture, int bActive = false; m_activeTextures.insert(pTexture); } - long textureMemChange = 0; - GLDEBUG(glBindTexture(GL_TEXTURE_2D, pTexture->getHandle(textureMemChange, lod_max_dim < m_lod_max_dim_cap ? lod_max_dim : m_lod_max_dim_cap, !bActive))); + size_t textureMemChange = 0; + pTexture->bind(textureMemChange, lod_max_dim < m_lod_max_dim_cap ? lod_max_dim : m_lod_max_dim_cap, !bActive); m_textureMemUsed += textureMemChange; if(bActive) { m_activeTextureMemUsed += textureMemChange; } else { m_activeTextureMemUsed += pTexture->getMemSize(); } - // TODO - These texture parameters should be assigned by the material or texture parameters - GLDEBUG(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f)); - GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)); - GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)); + } else { GLDEBUG(glBindTexture(GL_TEXTURE_2D, 0)); } @@ -130,20 +127,23 @@ void KRTextureManager::selectTexture(int iTextureUnit, KRTexture *pTexture, int } // Keep texture size within limits KRTexture *droppedTexture = (*m_poolTextures.begin()); - droppedTexture->releaseHandle(m_textureMemUsed); - m_poolTextures.erase(droppedTexture); - //fprintf(stderr, "Texture Swapping...\n"); + if(droppedTexture == NULL) { + break; + } else { + droppedTexture->releaseHandle(m_textureMemUsed); + m_poolTextures.erase(droppedTexture); + } } } // fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i Kbyte\n", (int)m_pContext->getModelManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024); } -long KRTextureManager::getMemUsed() { +size_t KRTextureManager::getMemUsed() { return m_textureMemUsed; } -long KRTextureManager::getActiveMemUsed() { +size_t KRTextureManager::getActiveMemUsed() { return m_activeTextureMemUsed; } diff --git a/KREngine/KREngine/Classes/KRTextureManager.h b/KREngine/KREngine/Classes/KRTextureManager.h index c07ee96..3c1080b 100644 --- a/KREngine/KREngine/Classes/KRTextureManager.h +++ b/KREngine/KREngine/Classes/KRTextureManager.h @@ -64,8 +64,8 @@ public: KRTexture *getTextureCube(const char *szName); KRTexture *getTexture(const char *szFile); - long getMemUsed(); - long getActiveMemUsed(); + size_t getMemUsed(); + size_t getActiveMemUsed(); int getLODDimCap(); @@ -79,8 +79,8 @@ private: std::set m_activeTextures; std::set m_poolTextures; - long m_textureMemUsed; - long m_activeTextureMemUsed; + size_t m_textureMemUsed; + size_t m_activeTextureMemUsed; int m_lod_max_dim_cap; }; diff --git a/KREngine/KREngine/Shaders/sky_box.fsh b/KREngine/KREngine/Shaders/sky_box.fsh new file mode 100644 index 0000000..cc4326a --- /dev/null +++ b/KREngine/KREngine/Shaders/sky_box.fsh @@ -0,0 +1,38 @@ +// +// sky_box.fsh +// KREngine +// +// Copyright 2012 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// + +uniform samplerCube diffuseTexture; + +varying mediump vec3 texCoord; + +void main() { + gl_FragColor = textureCube(diffuseTexture, normalize(texCoord)); +} \ No newline at end of file diff --git a/KREngine/KREngine/Shaders/sky_box.vsh b/KREngine/KREngine/Shaders/sky_box.vsh new file mode 100644 index 0000000..bccc0b9 --- /dev/null +++ b/KREngine/KREngine/Shaders/sky_box.vsh @@ -0,0 +1,49 @@ +// +// sky_box.vsh +// KREngine +// +// Copyright 2012 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// +// + +attribute vec4 vertex_position; +//attribute lowp vec4 vertex_uv; +// +//varying mediump vec2 textureCoordinate; + +varying mediump vec3 texCoord; +uniform highp mat4 inv_mvp_matrix_no_translate; // Inverse of the model-view-projection matrix, without view translation component +uniform mediump vec4 viewport; + +void main() +{ + gl_Position = vec4(vertex_position.xy, 1.0, 1.0); + + vec4 t = inv_mvp_matrix_no_translate * vec4(vertex_position.xy, 1.0, 1.0); + t /= t.w; + texCoord = vec3(t); +}