From 3e2155ae698c009bd9616e18a501fecee8d2f637 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 25 Jul 2017 18:15:00 -0400 Subject: [PATCH] Atmosphere Culling System (still not working properly). --- data/scene/atmosphereearth.scene | 4 +- .../rendering/atmospheredeferredcaster.cpp | 134 +++--------------- .../rendering/renderableatmosphere.cpp | 2 +- 3 files changed, 23 insertions(+), 117 deletions(-) diff --git a/data/scene/atmosphereearth.scene b/data/scene/atmosphereearth.scene index 6f30e1483f..3fd4ed412a 100644 --- a/data/scene/atmosphereearth.scene +++ b/data/scene/atmosphereearth.scene @@ -99,8 +99,8 @@ return { --"moon", "lodglobes/earth", - "lodglobes/mars", - "lodglobes/moon", + --"lodglobes/mars", + --"lodglobes/moon", --"satellites", --"mars-satellites", --"toyvolume", diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index db2b12e3d1..7321ffb5eb 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -314,121 +314,27 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData & renderData, const D program.setUniform("inscatterTexture", _inScatteringTableTextureUnit); // Atmosphere Frustum Culling - - - // DEBUG: - /* - if (_renderableClass == RenderablePlanet) { - glm::dvec3 objP = glm::dvec3(renderData.position[0] * pow(10, renderData.position[3]), - renderData.position[1] * pow(10, renderData.position[3]), renderData.position[2] * pow(10, renderData.position[3])); - glm::dvec4 cameraP = glm::inverse(_modelTransform) * glm::dvec4(-objP + renderData.camera.positionVec3(), 1.0); - std::cout << "====== Planet's position in KM: " << glm::to_string( objP/glm::dvec3(1000.0, 1000.0, 1000.0) ) - << " =======" << std::endl; - std::cout << "====== Distance from Planet's ground in KM: " - << glm::length(glm::dvec3(cameraP / glm::dvec4(1000.0, 1000.0, 1000.0, 1.0))) - _atmospherePlanetRadius - << " =======" << std::endl; - std::cout << "====== Camera Position: " << glm::to_string(renderData.camera.positionVec3()) << " =====" << std::endl; - } - else if (_renderableClass == RenderableGlobe) { - glm::dvec3 objP = renderData.modelTransform.translation; - glm::dvec4 cameraP = glm::inverse(_modelTransform) * glm::dvec4(renderData.camera.positionVec3(), 1); - std::cout << "====== Planet's position in KM: " << glm::to_string( objP/glm::dvec3(1000.0, 1000.0, 1000.0) ) - << " =======" << std::endl; - std::cout << "====== Distance from Planet's ground in KM: " - << glm::length(glm::dvec3(cameraP / glm::dvec4(1000.0, 1000.0, 1000.0, 1.0))) - _atmospherePlanetRadius - << " =======" << std::endl; - std::cout << "====== Camera Position: " << glm::to_string(renderData.camera.positionVec3()) << " =====" << std::endl; - std::cout << "--- Ellipsoid Radii: " << glm::to_string(_ellipsoidRadii) << " ----" << std::endl; - - // Testing Transformations: - //glm::dvec4 tObjCoords = glm::dvec4(0.0); tObjCoords.w = 1.0; - //std::cout << "==== Obj Coordinates: " << glm::to_string(tObjCoords) << " ====" << std::endl; - //glm::dvec4 tWorldCoords = _modelTransform * tObjCoords; - //std::cout << "==== World Coordinates: " << glm::to_string(tWorldCoords) << " ====" << std::endl; - //glm::dvec4 tSGCTEyeCoords = renderData.camera.combinedViewMatrix() * tWorldCoords; - //std::cout << "==== SGCT Eye Coordinates: " << glm::to_string(tSGCTEyeCoords) << " ====" << std::endl; - //glm::dvec4 tSGCTViewCoords = renderData.camera.projectionMatrix() * tSGCTEyeCoords; - //std::cout << "==== SGCT View Coordinates: " << glm::to_string(tSGCTViewCoords) << " ====" << std::endl; - //glm::dvec4 tSGCTEyeCoordsInv = dInverseProjection * tSGCTViewCoords; - //std::cout << "==== SGCT Eye Coordinates Inv: " << glm::to_string(tSGCTEyeCoords) << " ====" << std::endl; - //glm::dvec4 tWorldCoordsInv = glm::inverse(renderData.camera.combinedViewMatrix()) * tSGCTEyeCoordsInv; - //tWorldCoordsInv /= tWorldCoordsInv.w; - //std::cout << "==== World Coordinates Inv: " << glm::to_string(tWorldCoordsInv) << " ====" << std::endl; - //glm::dvec4 tObjCoordsInv = glm::inverse(_modelTransform) * tWorldCoordsInv; - //std::cout << "==== Obj Coordinates Inv: " << glm::to_string(tObjCoordsInv) << " ====" << std::endl; - - - ////glm::dmat4 cameraTranslation = glm::inverse(glm::translate(glm::dmat4(1.0), static_cast(renderData.camera.positionVec3()))); - ////glm::dmat4 sgctViewMatrix = renderData.camera.viewMatrix(); - ////glm::dmat4 camRotationMatrix = glm::mat4_cast(glm::inverse((glm::dquat)renderData.camera.rotationQuaternion())); - - ////glm::dmat4 SGCTEyeToWorld = glm::inverse(cameraTranslation) * glm::inverse(camRotationMatrix) * glm::inverse(sgctViewMatrix); - ////glm::dvec4 tWorldCoordsInv2 = SGCTEyeToWorld * tSGCTEyeCoordsInv; - ////tWorldCoordsInv2 /= tWorldCoordsInv2.w; - ////std::cout << "==== World Coordinates Inv2: " << glm::to_string(tWorldCoordsInv2) << " ====" << std::endl; - ////glm::dvec4 tObjCoordsInv2 = glm::inverse(_modelTransform) * tWorldCoordsInv2; - ////std::cout << "==== Obj Coordinates Inv2: " << glm::to_string(tObjCoordsInv2) << " ====" << std::endl; - - - ////glm::dmat4 objTranslation = glm::translate(glm::dmat4(1.0), renderData.modelTransform.translation); - ////glm::dmat4 objRotation = glm::dmat4(renderData.modelTransform.rotation); - ////glm::dmat4 objScaling = glm::scale(glm::dmat4(1.0), glm::dvec3(renderData.modelTransform.scale, - //// renderData.modelTransform.scale, renderData.modelTransform.scale)); - - ////glm::dmat4 modelTrans = objTranslation * objRotation * objScaling; - - ////std::cout << "==== Obj Coordinates Inv3: " << glm::to_string(glm::inverse(modelTrans) * tWorldCoordsInv) << " ====" << std::endl; - - ////glm::dmat4 invModelTrans = glm::inverse(objScaling) * glm::inverse(objRotation) * glm::inverse(objTranslation); - - ////std::cout << "==== Obj Coordinates Inv3: " << glm::to_string(invModelTrans * tWorldCoordsInv) << " ====" << std::endl; - - ////glm::dvec4 tmp = tWorldCoordsInv + glm::dvec4(-renderData.modelTransform.translation, 0.0); - ////glm::dvec3 tmp2 = glm::dmat3(glm::transpose(objRotation)) * glm::dvec3(tmp); - ////glm::dvec3 tmp3 = glm::dmat3(glm::inverse(objScaling)) * tmp2; - - ////std::cout << "==== Obj Coordinates Inv4: " << glm::to_string(tmp3) << " ====" << std::endl; - - ////glm::dvec4 tmp4 = glm::inverse(sgctViewMatrix) * tSGCTEyeCoordsInv; - //////glm::dvec4 tmp5 = glm::transpose(camRotationMatrix) * tmp4; - ////glm::dvec4 tmp5 = glm::inverse(camRotationMatrix) * tmp4; - ////glm::dvec3 tWorldCoordsInvHand = glm::dvec3(tmp5) - renderData.camera.positionVec3(); - ////std::cout << "==== World Coordinates Inv3: " << glm::to_string(tWorldCoordsInvHand) << " ====" << std::endl; - - ////glm::dvec3 tmp6 = tWorldCoordsInvHand - renderData.modelTransform.translation; - ////glm::dvec3 tmp7 = glm::dmat3(glm::transpose(objRotation)) * tmp6; - ////glm::dvec3 tmp8 = glm::dmat3(glm::inverse(objScaling)) * tmp7; - ////std::cout << "==== Obj Coordinates Inv5: " << glm::to_string(tmp8) << " ====" << std::endl; - - //// Doing it by parts like in RenderablePlanet: - //glm::dvec3 cameraPos = renderData.camera.positionVec3(); - //glm::dmat4 invSGCTEye = glm::inverse(glm::dmat4(renderData.camera.viewMatrix())); - //glm::dmat4 invCamRotationMatrix = glm::mat4_cast((glm::dquat)renderData.camera.rotationQuaternion()); - - //glm::dvec4 tOSEyeCoordsInv = invSGCTEye * tSGCTEyeCoordsInv; - //glm::dvec4 tmpRInv = invCamRotationMatrix * tOSEyeCoordsInv; - //glm::dvec4 tOSWorldCoordsInv = glm::dvec4(glm::dvec3(tmpRInv) + cameraPos, 1.0); - //std::cout << "==== World Coordinates Inv J: " << glm::to_string(tOSWorldCoordsInv) << " ====" << std::endl; - - //glm::dmat3 objRotationMatInv = glm::transpose(glm::dmat3(renderData.modelTransform.rotation)); - //glm::dmat4 objScalingMatInv = glm::scale(glm::dvec3(1.0/renderData.modelTransform.scale)); - - //glm::dvec4 objTrans = tOSWorldCoordsInv - glm::dvec4(renderData.modelTransform.translation, 0.0); - //glm::dvec4 objRot = glm::dvec4(objRotationMatInv * glm::dvec3(objTrans), 1.0); - //glm::dvec4 objPosInvFinal = objScalingMatInv * objRot; - //std::cout << "==== Obj Coordinates Inv J: " << glm::to_string(objPosInvFinal) << " ====" << std::endl; - - - //std::cout << "==== Obj Coordinates Inv J2: " << glm::to_string(glm::inverse(_modelTransform) * tOSWorldCoordsInv) - // << " ====" << std::endl; - - //std::cout << "\n\n---> ModelTrans: " << glm::to_string(_modelTransform) << std::endl; - //std::cout << "\n\n---> ModelTrans2: " << glm::to_string(modelTrans) << std::endl; - - - } - */ + glm::dvec4 tPlanetPosObj = glm::dvec4(renderData.position.dvec3(), 1.0); + glm::dvec4 tPlanetPosWorld = _modelTransform * tPlanetPosObj; + glm::dvec4 tPlanetPosSGCTEyeCoords = renderData.camera.combinedViewMatrix() * tPlanetPosWorld; + glm::dvec4 tPlanetPosSGCTViewCoords = renderData.camera.projectionMatrix() * tPlanetPosSGCTEyeCoords; + tPlanetPosSGCTViewCoords /= tPlanetPosSGCTViewCoords.w; + //tPlanetPosSGCTViewCoords *= -1.0; + glm::dvec3 perpVec = glm::cross(glm::dvec3(tPlanetPosObj.y, tPlanetPosObj.x, tPlanetPosObj.z), glm::dvec3(tPlanetPosObj)); + double radius = (_atmosphereRadius + 2.0) * 1000.0; + perpVec = glm::normalize(perpVec) * glm::dvec3(radius); + glm::dvec4 tPlanetPosSGCTViewCoordsR = glm::dmat4(renderData.camera.projectionMatrix()) * renderData.camera.combinedViewMatrix() * + _modelTransform * (tPlanetPosObj + glm::dvec4(perpVec, 0.0)); + tPlanetPosSGCTViewCoordsR /= tPlanetPosSGCTViewCoordsR.w; + //tPlanetPosSGCTViewCoordsR *= -1.0; + double dX = tPlanetPosSGCTViewCoords.x - std::max(-1.0, std::min(tPlanetPosSGCTViewCoords.x, 1.0)); + double dY = (1.0 - tPlanetPosSGCTViewCoords.y) - std::max(-1.0, std::min((1.0 - tPlanetPosSGCTViewCoords.y), 1.0)); + double dd = glm::distance(tPlanetPosSGCTViewCoords, tPlanetPosSGCTViewCoordsR); + std::cout << "----- Circle Center: " << glm::to_string(tPlanetPosSGCTViewCoords) << ", radius: " << dd + << " --------" << std::endl; + std::cout << "========= Test In Space: " << ((dX*dX + dY*dY) < (dd*dd)) + << " ==========" << std::endl; } void AtmosphereDeferredcaster::postRaycast(const RenderData & renderData, const DeferredcastData& deferredData, diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 5cf3797298..a939694e50 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -656,7 +656,7 @@ namespace openspace { _deferredcaster->setMieExtinctionCoefficients(_mieExtinctionCoeff); _deferredcaster->setRenderableClass(_atmosphereType); _deferredcaster->enableSunFollowing(_sunFollowingCameraEnabled); - + //_deferredcaster->setEllipsoidRadii(_ellipsoid.radii()); if (executeComputation) _deferredcaster->preCalculateAtmosphereParam(); }