topical media & game development
lib-game-delta3d-sdk-examples-testGameEnvironment-testgameenvironment.cpp / cpp
/* -*-c++-*-
* testGameEnvironment - testgameenvironment (.h & .cpp) - Using 'The MIT License'
* Copyright (C) 2005-2008, Alion Science and Technology Corporation
*
* 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.
*
* This software was developed by Alion Science and Technology Corporation under
* circumstances in which the U. S. Government may have rights in the software.
*
* William E. Johnson II
*/
include <dtABC/application.h>
include <dtABC/labelactor.h>
include <dtCore/environment.h>
include <dtCore/infiniteterrain.h>
include <dtCore/flymotionmodel.h>
include <dtCore/camera.h>
include <dtCore/deltawin.h>
include <dtCore/scene.h>
include <dtCore/transform.h>
include <dtDAL/actorproxy.h>
include <dtActors/weatherenvironmentactor.h>
include <dtActors/engineactorregistry.h>
include <dtUtil/exception.h>
include <dtGame/gamemanager.h>
include <osgGA/GUIEventAdapter>
class TestGameEnvironmentApp : public dtABC::Application
{
public:
TestGameEnvironmentApp()
{
Config();
mGM = new dtGame::GameManager(*GetScene());
dtCore::RefPtr<dtDAL::ActorProxy> proxy = mGM->CreateActor("dtcore.Terrain", "Infinite Terrain");
if (!proxy.valid())
{
LOG_ERROR("Failed to create the infinite terrain proxy. Aborting.");
Quit();
}
mTerrain = static_cast<dtCore::InfiniteTerrain*>(proxy->GetActor());
mGM->AddActor(*proxy);
mGM->CreateActor(*dtActors::EngineActorRegistry::WEATHER_ENVIRONMENT_ACTOR_TYPE, mEnvironmentActorProxy);
if (!mEnvironmentActorProxy.valid())
{
LOG_ERROR("Failed to create the environment proxy. Aborting.");
Quit();
}
mEnvironmentActor = static_cast<dtActors::WeatherEnvironmentActor*>(mEnvironmentActorProxy->GetActor());
mGM->SetEnvironmentActor(mEnvironmentActorProxy.get());
mFMM = new dtCore::FlyMotionModel(GetKeyboard(), GetMouse());
mFMM->SetTarget(GetCamera());
GetScene()->UseSceneLight(true);
dtCore::Transform transform(0.0f, 0.0f, 30.0f);
GetCamera()->SetTransform(transform);
CreateHelpLabel();
}
virtual void Config()
{
GetWindow()->SetWindowTitle("TestGameEnvironment");
dtABC::Application::Config();
}
virtual bool KeyPressed(const dtCore::Keyboard* keyboard,int key)
{
bool handled = true;
switch (key)
{
case '1':
{
mEnvironmentActor->EnableCloudPlane(!mEnvironmentActor->IsCloudPlaneEnabled());
break;
}
case '2':
{
mEnvironmentActor->EnableFog(!mEnvironmentActor->IsFogEnabled());
break;
}
case '3':
{
mEnvironmentActor->SetWeatherVisibility(dtActors::WeatherEnvironmentActor::VisibilityTypeEnum::VISIBILITY_CLOSE);
break;
}
case '4':
{
mEnvironmentActor->SetWeatherVisibility(dtActors::WeatherEnvironmentActor::VisibilityTypeEnum::VISIBILITY_MODERATE);
break;
}
case '5':
{
mEnvironmentActor->SetWeatherVisibility(dtActors::WeatherEnvironmentActor::VisibilityTypeEnum::VISIBILITY_UNLIMITED);
break;
}
case '6':
{
static bool enable = true;
if (enable)
{
mEnvironmentActor->SetWeatherTheme(dtActors::WeatherEnvironmentActor::WeatherThemeEnum::THEME_RAINY);
}
else
{
mEnvironmentActor->SetWeatherTheme(dtActors::WeatherEnvironmentActor::WeatherThemeEnum::THEME_FAIR);
}
enable = !enable;
break;
}
case '7':
{
static bool enable = true;
if (enable)
{
mEnvironmentActor->SetTimePeriodAndSeason(dtActors::WeatherEnvironmentActor::TimePeriodEnum::TIME_NIGHT, dtActors::WeatherEnvironmentActor::SeasonEnum::SEASON_WINTER);
}
else
{
mEnvironmentActor->SetTimePeriodAndSeason(dtActors::WeatherEnvironmentActor::TimePeriodEnum::TIME_DAY, dtActors::WeatherEnvironmentActor::SeasonEnum::SEASON_SUMMER);
}
enable = !enable;
break;
}
case '8':
{
static bool enable = true;
if (enable)
{
mEnvironmentActor->SetWindType(dtActors::WeatherEnvironmentActor::WindTypeEnum::WIND_SEVERE);
}
else
{
mEnvironmentActor->SetWindType(dtActors::WeatherEnvironmentActor::WindTypeEnum::WIND_NONE);
}
break;
}
case ' ':
{
dtActors::WeatherEnvironmentActorProxy* proxy =
mGM->GetEnvironmentActor() == NULL ?
mEnvironmentActorProxy.get() :
NULL;
mGM->SetEnvironmentActor(proxy);
GetScene()->UseSceneLight(true);
break;
}
case osgGA::GUIEventAdapter::KEY_Escape:
{
Quit();
break;
}
case osgGA::GUIEventAdapter::KEY_F1:
{
mLabel->SetActive(!mLabel->GetActive());
break;
}
default:
{
handled = false;
break;
}
}
return handled;
}
protected:
virtual ~TestGameEnvironmentApp()
{
}
private:
void CreateHelpLabel()
{
mLabel = new dtABC::LabelActor();
osg::Vec2 testSize(24.0f, 9.0f);
mLabel->SetBackSize(testSize);
mLabel->SetFontSize(0.8f);
mLabel->SetTextAlignment(dtABC::LabelActor::AlignmentEnum::LEFT_CENTER);
mLabel->SetText(CreateHelpLabelText());
mLabel->SetEnableDepthTesting(false);
mLabel->SetEnableLighting(false);
GetCamera()->AddChild(mLabel.get());
dtCore::Transform labelOffset(-17.0f, 50.0f, 8.5f, 0.0f, 90.0f, 0.0f);
mLabel->SetTransform(labelOffset, dtCore::Transformable::REL_CS);
AddDrawable(GetCamera());
}
std::string CreateHelpLabelText()
{
std::string testString("");
testString += "F1: Toggle Help Screen\n";
testString += "\n";
testString += "1: Toggle Clouds\n";
testString += "2: Toggle Fog\n";
testString += "3: Close Visibility\n";
testString += "4: Moderate Visibility\n";
testString += "5: Unlimited Visibility\n";
testString += "6: Toggle Rainy/Fair Theme\n";
testString += "7: Toggle Night/Day\n";
testString += "8: Toggle Severe/No Wind\n";
testString += "Space: Toggle EnvironmentActor\n";
return testString;
}
dtCore::RefPtr<dtGame::GameManager> mGM;
dtCore::RefPtr<dtActors::WeatherEnvironmentActorProxy> mEnvironmentActorProxy;
dtCore::RefPtr<dtActors::WeatherEnvironmentActor> mEnvironmentActor;
dtCore::RefPtr<dtCore::InfiniteTerrain> mTerrain;
dtCore::RefPtr<dtCore::FlyMotionModel> mFMM;
dtCore::RefPtr<dtABC::LabelActor> mLabel;
};
int main(int argc, char** argv)
{
try
{
dtCore::RefPtr<TestGameEnvironmentApp> app = new TestGameEnvironmentApp;
app->Config();
app->Run();
}
catch(const dtUtil::Exception& e)
{
e.LogException(dtUtil::Log::LOG_ERROR);
return -1;
}
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.