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); +}