Atmosphere Culling System (still not working properly).

This commit is contained in:
Jonathas Costa
2017-07-25 18:15:00 -04:00
parent 2d33b63383
commit 3e2155ae69
3 changed files with 23 additions and 117 deletions

View File

@@ -99,8 +99,8 @@ return {
--"moon",
"lodglobes/earth",
"lodglobes/mars",
"lodglobes/moon",
--"lodglobes/mars",
--"lodglobes/moon",
--"satellites",
--"mars-satellites",
--"toyvolume",

View File

@@ -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<glm::dvec3>(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,

View File

@@ -656,7 +656,7 @@ namespace openspace {
_deferredcaster->setMieExtinctionCoefficients(_mieExtinctionCoeff);
_deferredcaster->setRenderableClass(_atmosphereType);
_deferredcaster->enableSunFollowing(_sunFollowingCameraEnabled);
//_deferredcaster->setEllipsoidRadii(_ellipsoid.radii());
if (executeComputation)
_deferredcaster->preCalculateAtmosphereParam();
}