Ogre-AL
view release on metacpan or search on metacpan
examples/basic.pl view on Meta::CPAN
}
sub start {
my ($self) = @_;
$self->{root}->startRendering();
}
sub createScene {
my ($self) = @_;
my $mgr = $self->{sceneMgr};
# xxx: I have no idea what voodoo makes this work in C++....
# This is the API:
# void setSkyBox(bool enable, const String &materialName, Real distance=5000, bool drawFirst=true, const Quaternion &orientation=Quaternion::IDENTITY, const String &groupName=ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME)
# $mgr->setSkyBox(1, "Sky", 5, 8, 4000);
$mgr->setSkyBox(1, "Sky", 4000);
$mgr->setAmbientLight(Ogre::ColourValue->new(0.5, 0.5, 0.5));
$mgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
my $node = $mgr->getRootSceneNode->createChildSceneNode("OgreHead");
my $ent = $mgr->createEntity("Ogre", "ogrehead.mesh");
$node->attachObject($ent);
$node->setPosition(0, 50, 0);
my $sound = $self->{soundManager}->createSound("Roar", "roar.wav", 1);
$node->attachObject($sound);
$sound->play();
my $bgSound = $self->{soundManager}->createSound("ZeroFactor", "Zero Factor - Untitled.ogg", 1, 1);
$bgSound->setGain(0.7);
$bgSound->setRelativeToListener(1);
$bgSound->play();
$node = $mgr->getRootSceneNode->createChildSceneNode("CameraNode");
$node->setPosition(0, 100, 100);
my $pitchNode = $node->createChildSceneNode("PitchNode");
$pitchNode->attachObject($self->{camera});
$pitchNode->attachObject($self->{soundManager}->getListener());
$pitchNode->pitch(Ogre::Degree->new(-30));
# Create a ground plane (just like examples/ninja.pl in Perl Ogre distribution)
my $plane = Ogre::Plane->new(Ogre::Vector3->new(0, 1, 0), 0);
my $meshmgr = Ogre::MeshManager->getSingletonPtr();
$meshmgr->createPlane("ground",
DEFAULT_RESOURCE_GROUP_NAME,
$plane, 15000, 15000, 20, 20, 1, 1, 5, 5,
Ogre::Vector3->new(0, 0, 1));
$ent = $mgr->createEntity("GroundEntity", "ground");
$mgr->getRootSceneNode->createChildSceneNode->attachObject($ent);
$ent->setMaterialName("Ground");
$ent->setCastShadows(0);
my $light = $mgr->createLight("sun");
$light->setType(LT_DIRECTIONAL);
$light->setDirection(-1,-1,-1);
# Perl note: see Ogre::BetaGUI::GUI createOverlay for a similar example
# (note also createOverlayContainer is specific to Perl Ogre)
my $overlayMgr = Ogre::OverlayManager->getSingletonPtr;
my $panel = $overlayMgr->createOverlayContainer("Panel", "PanelName");
$panel->setMetricsMode(GMM_PIXELS);
$panel->setPosition(10, 10);
$panel->setDimensions(100, 100);
my $textArea = $overlayMgr->createTextAreaOverlayElement("TextArea", "TextAreaName");
$textArea->setMetricsMode(GMM_PIXELS);
$textArea->setPosition(0, 0);
$textArea->setDimensions(100, 100);
$textArea->setCharHeight(16);
$textArea->setFontName("Arial");
$textArea->setCaption("Hello, World!");
my $overlay = $overlayMgr->create("AverageFps");
$overlay->add2D($panel);
$panel->addChild($textArea);
$overlay->show();
}
sub setupResources {
my ($self) = @_;
my $cf = Ogre::ConfigFile->new();
$cf->load("resources.cfg");
# note: this is a Perlish replacement for iterators used in C++
my $secs = $cf->getSections();
my $rgm = Ogre::ResourceGroupManager->getSingletonPtr();
foreach my $sec (@$secs) {
my $secName = $sec->{name};
my $settings = $sec->{settings};
foreach my $setting (@$settings) {
my ($typeName, $archName) = @$setting;
$rgm->addResourceLocation($archName, $typeName, $secName);
}
}
$rgm->initialiseAllResourceGroups();
}
sub configure {
my ($self) = @_;
# this shows an alternative to the way Ogre::ExampleApplication does it
unless ($self->{root}->restoreConfig()) {
unless ($self->{root}->showConfigDialog()) {
exit;
}
}
$self->{win} = $self->{root}->initialise(1, "Ogre Framework");
}
sub chooseSceneManager {
my ($self) = @_;
$self->{sceneMgr} = $self->{root}->createSceneManager(ST_GENERIC, "MainSceneManager");
}
sub createCamera {
my ($self) = @_;
$self->{camera} = $self->{sceneMgr}->createCamera("SimpleCamera");
$self->{camera}->setNearClipDistance(1.0);
}
sub createViewports {
my ($self) = @_;
my $vp = $self->{win}->addViewport($self->{camera});
$vp->setBackgroundColour(Ogre::ColourValue->new(0,0,0));
$self->{camera}->setAspectRatio($vp->getActualWidth() / $vp->getActualHeight());
}
1;
( run in 1.862 second using v1.01-cache-2.11-cpan-39bf76dae61 )