topical media & game development

talk show tell print

lib-game-delta3d-sdk-examples-testPreRender-testprerender.cpp / cpp



  /* -*-c++-*-
  * testprerender - testprerender (.h & .cpp) - Using 'The MIT License'
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  *
  * Michael Guerrero
  */
  
  include <testprerender.h>
  
  include <dtCore/globals.h>
  include <dtCore/camera.h>
  include <dtCore/scene.h>
  include <dtCore/deltawin.h>
  include <dtCore/transform.h>
  
  include <dtDAL/project.h>
  include <dtDAL/map.h>
  
  include <osg/Texture2D>
  include <osgGA/GUIEventAdapter>
  
  
//////////////////////////////////////////////////////////////////////////

TestPreRender::TestPreRender(const std::string& mainSceneObjectName, const std::string& configFilename /*= "config.xml"*/) : Application(configFilename) { LoadGeometry(mainSceneObjectName); dtCore::Transform objectTransform; mBoxObject->GetTransform(objectTransform); // Adjust the positioning of the camera depending on the size of the object CenterCameraOnObject(mBoxObject.get()); int x, y, width, height; GetWindow()->GetPosition(x, y, width, height); CreateTextureScene(); CreateTextureTarget(width, height); CreateTextureCamera(width, height); // Create the view and attach the associated resources mTextureView = new dtCore::View; mTextureView->SetScene(mTextureScene.get()); mTextureView->SetCamera(mTextureCamera.get()); AddView(*mTextureView); // Give the camera a texture to render to mTextureCamera->GetOSGCamera()->attach(osg::Camera::COLOR_BUFFER, mTextureTarget.get()); // Override the default texture for the model and apply our rendered texture osg::StateSet* ss = mBoxObject->GetOSGNode()->getOrCreateStateSet(); ss->setTextureAttributeAndModes(0, mTextureTarget.get(), osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); // Apply the motion model to control the light centered around our object mOrbitMotion = new dtCore::OrbitMotionModel(GetKeyboard(), GetMouse()); mOrbitMotion->SetTarget(mTextureCamera.get()); }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::LoadGeometry(const std::string& customObjectName) { mBoxObject = new dtCore::Object("Main Scene Object"); mBoxObject->LoadFile(customObjectName); AddDrawable(mBoxObject.get()); }
//////////////////////////////////////////////////////////////////////////

bool TestPreRender::KeyPressed(const dtCore::Keyboard* keyboard, int key) { bool verdict(false); switch(key) { case osgGA::GUIEventAdapter::KEY_Escape: { this->Quit(); verdict = true; break; } case osgGA::GUIEventAdapter::KEY_Return: if (keyboard->GetKeyState(osgGA::GUIEventAdapter::KEY_Alt_L) || keyboard->GetKeyState(osgGA::GUIEventAdapter::KEY_Alt_R)) { bool onOrOff = !GetWindow()->GetFullScreenMode(); GetWindow()->SetFullScreenMode(onOrOff); } } return verdict; }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::PreFrame(const double deltaFrameTime) { static float mTotalTime = 0.0f; mTotalTime += deltaFrameTime * 0.15f; osg::Matrix rotateMat; rotateMat.makeRotate(osg::DegreesToRadians(30.0f) * mTotalTime, osg::Vec3(1.0f, 0.0f, 1.0f)); dtCore::Transform objectTransform; mBoxObject->GetTransform(objectTransform); objectTransform.SetRotation(rotateMat); mBoxObject->SetTransform(objectTransform); }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::CenterCameraOnObject(dtCore::Object* object) { osg::Vec3 center; float radius; object->GetBoundingSphere(&center, &radius); // position the camera slightly behind the origin dtCore::Transform cameraTransform; cameraTransform.SetTranslation(center -osg::Y_AXIS * radius * 4.0f); GetCamera()->SetTransform(cameraTransform); }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::CreateTextureScene() { // Create a new custom scene mTextureScene = new dtCore::Scene; // Set the root directory where our art assets are to be found std::string contextName = dtCore::GetDeltaRootPath() + "/examples/data/demoMap"; dtDAL::Project::GetInstance().SetContext(contextName, true); // Load the map into our custom scene dtDAL::Map& map = dtDAL::Project::GetInstance().LoadMapIntoScene("MyCoolMap", *mTextureScene); std::vector<dtCore::RefPtr<dtDAL::ActorProxy> > container; map.FindProxies(container, "", "", "", "dtCore::SkyBox"); // Add the skybox to the main scene as well GetScene()->AddDrawable(container[0]->GetActor()); }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::CreateTextureCamera(int width, int height) { // Create the delta camera mTextureCamera = new dtCore::Camera("Texture Camera"); mTextureCamera->SetWindow(GetWindow()); mTextureCamera->SetNearFarCullingMode(dtCore::Camera::NO_AUTO_NEAR_FAR); // Make the necessary changes directly to the osg camera osg::Camera* osgCam = mTextureCamera->GetOSGCamera(); osgCam->setReferenceFrame(osg::Transform::ABSOLUTE_RF); osgCam->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); osgCam->setRenderOrder(osg::Camera::PRE_RENDER); osgCam->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); osgCam->setViewport(0, 0, width, height); }
//////////////////////////////////////////////////////////////////////////

void TestPreRender::CreateTextureTarget(int width, int height) { // All of these parameters must be set for frame buffer objects (FBO's) to work mTextureTarget = new osg::Texture2D; mTextureTarget->setTextureSize(width, height); mTextureTarget->setInternalFormat(GL_RGBA); mTextureTarget->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); mTextureTarget->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); // Extra non essential parameters mTextureTarget->setResizeNonPowerOfTwoHint(false); mTextureTarget->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER); mTextureTarget->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER); mTextureTarget->setBorderColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); }
//////////////////////////////////////////////////////////////////////////

TestPreRender::~TestPreRender() { // This needs to be done in order to ensure that our // manually loaded map can properly deallocate resources dtDAL::Project& project = dtDAL::Project::GetInstance(); project.CloseAllMaps(true); }
//////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[]) { std::string mainObjectName = "models/physics_crate.ive"; // Allow specifying of custom geometry from the command line if (argc > 1) { mainObjectName = std::string(argv[1]); } std::string dataPath = dtCore::GetDeltaDataPathList(); dtCore::SetDataFilePathList(dataPath + ";" + dtCore::GetDeltaRootPath() + "/examples/data" + ";" + dtCore::GetDeltaRootPath() + "/examples/testPreRender"); // We need to set custom display settings before the creating the app osg::DisplaySettings* display = osg::DisplaySettings::instance(); display->setMinimumNumStencilBits(8); dtCore::RefPtr<TestPreRender> app = new TestPreRender(mainObjectName, "config.xml"); app->Config(); app->Run(); return 0; }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.