void NPCCharacter::_behaviorIdle() { stop(); //still want to point the character in the direction last traveled. Ogre::Vector3 vel = getVelocity(); float speed = vel.length(); Ogre::Vector3 src = _node->getOrientation() * Ogre::Vector3::NEGATIVE_UNIT_Z; src.y = 0; vel.y = 0; vel.normalise(); _node->rotate(src.getRotationTo(vel)); _isBhvFinished = true; //transition to idle animation _animHandler.blend("Idle",AnimationBlender::BlendWhileAnimating,.2f,true); }
Ogre::Vector3 SteeringBehaviors::Pursuit(Character* evader) { Ogre::Vector3 ToEvader = evader->GetSceneNode()->getPosition() - mCharacter->GetSceneNode()->getPosition(); double RelativeHeading = mCharacter->GetHeading().dotProduct(evader->GetHeading()); //if evader is in front and moving forward if((ToEvader.dotProduct(mCharacter->GetHeading())) > 0 && (RelativeHeading < -0.95)) return Seek(evader->GetSceneNode()->getPosition()); //not ahead so look forward double LookAheadTime = ToEvader.length() / (mCharacter->GetMaxSpeed() + evader->GetMaxSpeed()); Ogre::Vector3 currentVelocity = evader->GetVelocity(); Ogre::Real currentSpeed = currentVelocity.normalise(); Ogre::Vector3 desiredVelocity = Seek(evader->GetSceneNode()->getPosition() + evader->GetHeading() * currentSpeed * LookAheadTime); desiredVelocity.y = 0; return desiredVelocity; }
MapCameraLightning::MapCameraLightning(Ogre::SceneManager& sceneManager) : mSceneManager(sceneManager) { mLight = sceneManager.createLight("MapFixedSunLight"); mLight->setType(Ogre::Light::LT_DIRECTIONAL); mLight->setPosition(Ogre::Vector3(-500,300,-350)); Ogre::Vector3 dir = -mLight->getPosition(); dir.normalise(); mLight->setDirection(dir); mLight->setDiffuseColour(Ogre::ColourValue(0.8, 0.8, 0.6)); //yellow //mSun->setSpecularColour(1, 1, 0.7); //yellow mLight->setCastShadows(false); mLight->setAttenuation(1000000, 1, 0, 0); mLight->setVisible(false); }
void RoomSurface::init(Ogre::Vector3 normal, Ogre::Real x_size, Ogre::Real z_size, CreateVisualActor create_visual_actor) { create_visual_actor_ = create_visual_actor == CREATE_VISUAL_ACTOR; init(); normal.normalise(); normal_ = normal; // ***Important*** // The surface is constructed from a "flat" rectangle sitting in the xz-plane, hence // we define its size by the x- and z- sizes. Once the surface has been rotated to have the // passed-in normal the x_size and z_size will not actually correspond to the surfaces' // x and z dimensions in world space. StaticBox::set_size(Ogre::Vector3(x_size, kSurfaceThickness, z_size)); // Rotate the box to correspond to the passed-in normal set_orientation(surfaceOrientationForNormal(normal)); }
void CharacterMovement::rotateTo( QVector3D directionLook ) { qDebug() << "[CharacterMovement::rotateTo]" << directionLook; Ogre::Vector3 newDirection = UtilFunctions::qVector3dToOgreVector3( directionLook ) - _node->getPosition(); newDirection.y = 0; newDirection.normalise(); // Check if it is necessary to rotate // Ogre::Vector3 auxDirection = UtilFunctions::qVector3dToOgreVector3( _direction ); // auxDirection.normalise(); // qDebug() << "[CharacterMovement::rotateTo]" << directionLook << newDirection.dotProduct( auxDirection ); // if( newDirection.dotProduct( auxDirection ) != 1 ) { _direction = UtilFunctions::ogreVector3ToQVector3d( newDirection ); _rotationValue = -4.0f; // TODO: find another was to stop the rotation (it wasn't stopping) _rotating = true; } }
// ---------------------------------------------------------- void OgreTestWidget::OnInit() { Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); mSceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC,"principal"); // create camera mCamera = mSceneMgr->createCamera("PlayerCam_EntityPanel" + mName); mCamera->setPosition(Ogre::Vector3(0, 0, -40)); mCamera->lookAt(Ogre::Vector3(0,0,0)); mCamera->setAutoAspectRatio(true); mCamera->setNearClipDistance(0.1); // create viewport mViewport = mRenderWindow->addViewport(mCamera); mViewport->setBackgroundColour(Ogre::ColourValue(0.1, 0.1, 0.1, 1)); mCamera->setAspectRatio((mViewport->getActualWidth()) / (mViewport->getActualHeight())); mViewport->_updateDimensions(); mSceneMgr->setAmbientLight(Ogre::ColourValue(0.1,0.1,0.1)); Ogre::Light* luz = mSceneMgr->createLight("Light0"); luz->setType(Ogre::Light::LT_SPOTLIGHT); luz->setPosition(0,100,-100); luz->setSpotlightRange(Ogre::Degree(10), Ogre::Degree(90)); Ogre::Vector3 direccion = -luz->getPosition(); direccion.normalise(); luz->setDirection(direccion); luz->setDiffuseColour(1,1,1); luz->setSpecularColour(0.25, 0.25, 0.25); mFocusNodo = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3::ZERO); mFocusNodo->attachObject(mCamera); /* mNodoEscena = mSceneMgr->getRootSceneNode()->createChildSceneNode(); Ogre::Entity* entity = mSceneMgr->createEntity("pelota1", "flechaShape.mesh"); mNodoEscena->attachObject(entity); */ }
/* Return vector for a normalized (radius 1.0) sphere */ Ogre::Vector3 Grid::projectToSphere(unsigned int x, unsigned int y) { Ogre::Vector3 pos; float mSizeFloat, xFloat, yFloat, halfStep; mSizeFloat = static_cast<float>(gridSize); xFloat = static_cast<float>(x)/mSizeFloat; yFloat = static_cast<float>(y)/mSizeFloat; halfStep = 1.0f/(mSizeFloat*2.0f); // For convenience treat xy-heightmap as a xz-plane in sphere-coordinates pos.x = 1.0f-halfStep - xFloat*2.0f; pos.z = -1.0f+halfStep + yFloat*2.0f; pos.y = 1.0f; // Simple re-orientation pos = orientation*pos; // project heightMap to sphere pos.normalise(); return pos; }
void PhysicsRagDoll::_joinBones(PhysicsRagDoll::JointType type, RagBone* parent, RagBone* child, Ogre::Vector3 pos, Ogre::Vector3 pin, Ogre::Real limit1, Ogre::Real limit2, OgreNewt::World* world) { pin.normalise(); OgreNewt::Joint* joint = NULL; switch (type) { case PhysicsRagDoll::JT_BALLSOCKET: joint = new OgreNewt::BasicJoints::BallAndSocket(world, child->getBody(), parent->getBody(), pos); ((OgreNewt::BasicJoints::BallAndSocket*)joint)->setLimits(pin, Ogre::Degree(limit1), Ogre::Degree(limit2)); break; case PhysicsRagDoll::JT_HINGE: joint = new OgreNewt::BasicJoints::Hinge(world, child->getBody(), parent->getBody(), pos, pin); ((OgreNewt::BasicJoints::Hinge*)joint)->setCallback(RagBone::_hingeCallback); joint->setUserData(Ogre::Any(child)); child->setLimits(limit1, limit2); break; } }
bool CollisionTools::collidesWithEntity(const Ogre::Vector3& fromPoint, const Ogre::Vector3& toPoint, const float collisionRadius, const float rayHeightLevel, const Ogre::uint32 queryMask) { Ogre::Vector3 fromPointAdj(fromPoint.x, fromPoint.y + rayHeightLevel, fromPoint.z); Ogre::Vector3 toPointAdj(toPoint.x, toPoint.y + rayHeightLevel, toPoint.z); Ogre::Vector3 normal = toPointAdj - fromPointAdj; float distToDest = normal.normalise(); Ogre::Vector3 myResult(0, 0, 0); Ogre::MovableObject* myObject = NULL; float distToColl = 0.0f; if (raycastFromPoint(fromPointAdj, normal, myResult, myObject, distToColl, queryMask)) { distToColl -= collisionRadius; return (distToColl <= distToDest); } else { return false; } }
//Moves the Character Ogre::Vector3 PlayerCharacter::updateMovement(unsigned long timeSinceLastFrame, Vector3 inputMoveDir, Ogre::Radian* moveDirRotAngle) { //static const float maxUpdateDelay = 0.1f; //Ogre::Vector3 moveVector = Quaternion(*moveDirRotAngle, Vector3::UNIT_Y) * inputMoveDir; Ogre::Vector3 moveVector = this->node->getOrientation() * inputMoveDir; moveVector.normalise(); // Acceleration if( inputMoveDir.isZeroLength() ) { curMoveSpeed -= 0.001f * timeSinceLastFrame; curMoveSpeed = (curMoveSpeed < 0.001f) ? 0.f : curMoveSpeed; } else { curMoveSpeed += 0.001f * timeSinceLastFrame; curMoveSpeed = (curMoveSpeed > maxMoveSpeed) ? maxMoveSpeed : curMoveSpeed; } // Standing or running? if( curMoveSpeed == 0.f ) { this->animation->setNextAction("stop"); return node->getPosition(); } else { this->animation->setNextAction("run"); Ogre::Vector3 newPos = node->getPosition() + moveVector * curMoveSpeed * (Ogre::Real)timeSinceLastFrame; this->node->setPosition(newPos); // Pass actual character speed on to animation system this->animation->setFlagValue( "character_speed", curMoveSpeed ); return newPos; } }
void SingleplayerGame::onHUDPhysicalSelect(Player* attacker, Player* target) { mAttackRunning = true; bool attackSuccessful = attacker->attemptPhysicalAttack(); attacker->lookAt(target); AnimationCallback cb = [this, attacker, target, attackSuccessful](void)-> void{ if (attackSuccessful) { attacker->lookAt(target); attacker->physicalAttack(*target); if (!target->isDead()) { time_t physicalStartTime = time(nullptr); ParticleEndCheckCallback endCheck = [physicalStartTime](void) -> bool { return difftime(time(nullptr), physicalStartTime) >= 1; }; ParticleCallback onEnd = [](void) -> void {}; target->mParticleController->runParticleSystem(PT_Physical, endCheck, onEnd); } } else { attacker->missAttack(*target); } mAttackRunning = false; attacker->mAnimationController->runIdleAnimation(); }; attacker->mAnimationController->runAnimation(AnimationType::Physical, cb); if (attackSuccessful) { mSoundBank->play("physical_woosh_fx"); mSoundBank->play("physical_impact_fx"); } else { mSoundBank->play("physical_miss_fx"); } Ogre::Vector3 camPos = (attacker->sceneNode->_getDerivedPosition() + Ogre::Vector3(0, 200, 0)) - (target->sceneNode->_getDerivedPosition() + Ogre::Vector3(0, 100, 0)); camPos.normalise(); camPos *= 300; camPos += (attacker->sceneNode->_getDerivedPosition() + Ogre::Vector3(0, 200, 0)); mRenderer->mCamera->setPosition(camPos); mRenderer->mCamera->lookAt(target->sceneNode->_getDerivedPosition() + Ogre::Vector3(0, 100, 0)); }
void SlideCollisionResponse::Response(PhysObjDescriptor* object, CollisionModel3D *CollisionModel, bool ismodelowner) { // при коллизии определяется треугольник и объект движется параллельно плоскости тругольника float t1[9], t2[9], p[3], *t; CollisionModel->getCollisionPoint(p,false); Ogre::Vector3 normal, IntersectionPoint(p[0],p[1],p[2]); CollisionModel->getCollidingTriangles(t1, t2, false); if (ismodelowner) t=t1; else t=t2; Ogre::Plane collidplane(Ogre::Vector3(t[0],t[1],t[2]), Ogre::Vector3(t[3],t[4],t[5]), Ogre::Vector3(t[6],t[7],t[8])); Ogre::Vector3 proj = collidplane.projectVector(object->LinVelocity); proj.normalise(); Ogre::Vector3 Normal = collidplane.normal; Ogre::Vector3 linvel = object->LinVelocity; Ogre::Vector3 throttle = object->Throttle; Ogre::Vector3 dir=proj+Normal/2; dir.normalise(); object->Object->SetForces(Ogre::Vector3::ZERO); object->VelocityVector = dir*(linvel.length()+1); object->LinVelocity = dir*(linvel.length()+1); object->Object->SetReplacingDirection(dir*(linvel.length()+1)); object->Object->AddForce(IntersectionPoint, dir*(linvel.length()+1)*Owner->GetMass()/object->Object->GetMass()); }
bool CCameraController::mouseMoved( const OIS::MouseEvent &arg ) { Ogre::Vector3 vtPlayerPos = m_pBindObject->GetPosition(); if( arg.state.buttonDown( OIS::MB_Right ) ) { Rotate(arg.state.X.rel, arg.state.Y.rel); Ogre::Vector3 vtCamera = m_pCamera->getPosition(); Ogre::Vector3 vtDir = vtCamera-vtPlayerPos; vtDir.normalise(); vtDir.y = 0; m_pBindObject->SetDirection(vtDir); } if( arg.state.buttonDown( OIS::MB_Left ) ) { Rotate(arg.state.X.rel, arg.state.Y.rel); } return true; }
VOID CCameraController::Rotate( float x, float y ) { float angle = -x * 0.01f; float xt = m_vecUnitDir.x * cos(angle) + m_vecUnitDir.z * sin(angle); float zt = m_vecUnitDir.z * cos(angle) - m_vecUnitDir.x * sin(angle); m_vecUnitDir.x = xt; m_vecUnitDir.z = zt; //¼ÆËãXZÐýתÖá Ogre::Vector3 axis; axis.x = -m_vecUnitDir.z; axis.z = m_vecUnitDir.x; axis.y = 0; axis.normalise(); //ÑØÖáÐýת { float angle = y * 0.01f; float x = m_vecUnitDir.x * (axis.x * axis.x * (1 - cos(angle)) + cos(angle)) + m_vecUnitDir.y * (axis.x * axis.y * (1 - cos(angle)) - axis.z * sin(angle)) + m_vecUnitDir.z * (axis.x * axis.z * (1 - cos(angle)) + axis.y * sin(angle)); float y = m_vecUnitDir.x * (axis.x * axis.y * (1 - cos(angle)) + axis.z * sin(angle)) + m_vecUnitDir.y * (axis.y * axis.y * (1 - cos(angle)) + cos(angle)) + m_vecUnitDir.z * (axis.y * axis.z * (1 - cos(angle)) - axis.x * sin(angle)); float z = m_vecUnitDir.x * (axis.x * axis.z * (1 - cos(angle)) - axis.y * sin(angle)) + m_vecUnitDir.y * (axis.y * axis.z * (1 - cos(angle)) + axis.x * sin(angle)) + m_vecUnitDir.z * (axis.z * axis.z * (1 - cos(angle)) + cos(angle)); m_vecUnitDir.x = x; m_vecUnitDir.y = y; m_vecUnitDir.z = z; } m_bPositionUpate = TRUE; }
bool DeferredLight::isCameraInsideLight(Ogre::Camera* camera) { switch (mParentLight->getType()) { case Ogre::Light::LT_DIRECTIONAL: return false; case Ogre::Light::LT_POINT: { Ogre::Real distanceFromLight = camera->getDerivedPosition().distance(mParentLight->getDerivedPosition()); return distanceFromLight <= mRadius + camera->getNearClipDistance() + 0.1; } case Ogre::Light::LT_SPOTLIGHT: { Ogre::Vector3 lightPos = mParentLight->getDerivedPosition(); Ogre::Vector3 lightDir = mParentLight->getDerivedDirection(); Ogre::Radian attAngle = mParentLight->getSpotlightOuterAngle(); //Extend the analytic cone's radius by the near clip range by moving its tip accordingly. //Some trigonometry needed here. Ogre::Vector3 clipRangeFix = -lightDir * (camera->getNearClipDistance() / Ogre::Math::Tan(attAngle/2)); lightPos = lightPos + clipRangeFix; Ogre::Vector3 lightToCamDir = camera->getDerivedPosition() - lightPos; Ogre::Real distanceFromLight = lightToCamDir.normalise(); Ogre::Real cosAngle = lightToCamDir.dotProduct(lightDir); Ogre::Radian angle = Ogre::Math::ACos(cosAngle); //Check whether we will see the cone from our current POV. return (distanceFromLight <= (mParentLight->getAttenuationRange() + clipRangeFix.length())) && (angle <= attAngle); } default: //Please the compiler return false; } }
void CameraMan::frameRendered(const Ogre::FrameEvent &evt) { if (mStyle == CS_FREELOOK) { // build our acceleration vector based on keyboard input composite Ogre::Vector3 accel = Ogre::Vector3::ZERO; Ogre::Matrix3 axes = mCamera->getLocalAxes(); if (mGoingForward) accel -= axes.GetColumn(2); if (mGoingBack) accel += axes.GetColumn(2); if (mGoingRight) accel += axes.GetColumn(0); if (mGoingLeft) accel -= axes.GetColumn(0); if (mGoingUp) accel += axes.GetColumn(1); if (mGoingDown) accel -= axes.GetColumn(1); // if accelerating, try to reach top speed in a certain time Ogre::Real topSpeed = mFastMove ? mTopSpeed * 20 : mTopSpeed; if (accel.squaredLength() != 0) { accel.normalise(); mVelocity += accel * topSpeed * evt.timeSinceLastFrame * 10; } // if not accelerating, try to stop in a certain time else mVelocity -= mVelocity * evt.timeSinceLastFrame * 10; Ogre::Real tooSmall = std::numeric_limits<Ogre::Real>::epsilon(); // keep camera velocity below top speed and above epsilon if (mVelocity.squaredLength() > topSpeed * topSpeed) { mVelocity.normalise(); mVelocity *= topSpeed; } else if (mVelocity.squaredLength() < tooSmall * tooSmall) mVelocity = Ogre::Vector3::ZERO; if (mVelocity != Ogre::Vector3::ZERO) mCamera->translate(mVelocity * evt.timeSinceLastFrame); } }
// Returns volume for the right ear. // If the sound is directly to the right, that channel gets 254 of intensity. // If the sound is directly in front of us, each channel gets 254/2 of intensity. int SoundManager::calcPanning(Ogre::Camera* mCamera, Ogre::Vector3 soundPosition) { Ogre::Vector3 camDirection = mCamera->getOrientation() * Ogre::Vector3::NEGATIVE_UNIT_Z; Ogre::Vector3 soundDir = soundPosition - mCamera->getPosition(); soundDir.normalise(); // Retrieve the angle made between the sound position and the camera's direction, // which should be pointing forwards. Ogre::Quaternion q = camDirection.getRotationTo(soundDir); Ogre::Radian radians = q.getYaw(); // anything left of the camera returns positive degrees float degrees = radians.valueDegrees(); int leftIntensity; int rightIntensity; // from 0 to -179 it's the right ear. if(degrees <= 0) { //std::cout << "degrees " << degrees << std::endl; degrees *= -1; if(degrees > 90) degrees = 90 - (degrees - 90); // if 91, we subtract 1 and go back to 89 // Intensity can never be 255 because then the effect cancels out. int intensity = (degrees / 90.0) * 254/2 + 254/2; //std::cout << "intensity " << intensity << std::endl; rightIntensity = intensity; leftIntensity = 255 - (rightIntensity); } // from 0 to 179 it's the left ear. else { if(degrees > 90) degrees = 90 - (degrees - 90); int intensity = (degrees / 90) * 254/2 + 254/2; //std::cout << "intensity " << intensity << std::endl; leftIntensity = intensity; rightIntensity = 254 - (leftIntensity); } return rightIntensity; }
void Jinx::update(const Ogre::Real time) { if (mDead) { mTimeSinceDead += time; return; } if (mTarget) { mDestination = mTarget->getPosition(); } Ogre::Vector3 direction = mDestination - mNode->getPosition(); Ogre::Real distance = direction.normalise(); Ogre::Vector3 move = direction * time * mSpeed; mNode->translate(move); if (distance < 1.0f) { if (mTarget) { mTarget->takeDamage(mPower); } mSystem->setEmitting(false); mDead = true; } }
void AIRayPathFinderStrategy::GoTo(Vector3 point) { Ogre::Vector3 Position = Parent->GetPosition(); Ogre::Vector3 vr; //vr=Position-point; Parent->GetScenable()->GetOrientation(); vr=Parent->GetScenable()->GetOrientation()*Ogre::Vector3::UNIT_Z; Vector3 AccelerationOn(Vector3::ZERO); // = Parent->GetAccelerationOn(); IPhysical *phys = Parent->GetPhysical(); assert(phys); vr.normalise(); phys->SetForwardDirection(vr); AccelerationOn.z=-1; //phys->SetVelocityVector(vr); phys->SetAcceleration(AccelerationOn); }
void Application::handleAi() { // For now AI just mirrors the player's paddle Ogre::Vector3 pos = _thePaddle->getNode()->getPosition(); Ogre::Quaternion qt = _thePaddle->getNode()->getOrientation(); Ogre::Vector3 ballPos = _theBall->getNode()->getPosition(); // The ball is on the opponent's side of the net _otherPaddle->movePaddle(_oisManager, height, width, (float)ballPos.x, (float)ballPos.z + 500); Ogre::Vector3 ballNormal = _theBall->getNode()->getPosition() - _otherPaddle->getNode()->getPosition(); if(ballNormal.length() <= 200) { ballNormal.normalise(); ballNormal += Ogre::Vector3(0,0,0.5); int power = 3000; btVector3 impulse = btVector3(ballNormal.x*power, ballNormal.y*power, ballNormal.z*power); btVector3 rel_pos = btVector3(0,0,0); _theBall->applyImpulse(impulse, rel_pos); } }
void TutorialApplication::evilShot(ShipProject::GameObject* enemy, double speed) { Ogre::Entity* ball = mSceneMgr->createEntity("projectile"); ball->setMaterialName("Projectile/Red"); Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); Ogre::Vector3 dir = player->entity()->getParentSceneNode()->getPosition() - enemy->entity()->getParentSceneNode()->getPosition(); dir.normalise(); Ogre::Quaternion orient = Ogre::Vector3::NEGATIVE_UNIT_Z.getRotationTo(dir); node->setPosition(enemy->entity()->getParentSceneNode()->getPosition() ); node->setOrientation(orient); node->translate( orient * (Ogre::Vector3::UNIT_Z * -0.5) ); node->attachObject(ball); ShipProject::GameObject* oBall = new ShipProject::GameObject(ball, 0.25); oBall->SetupCollision(new btSphereShape(PROJECTILE_RADIUS), CollisionGroup::PROJECTILES_BALLS, CollisionGroup::PLAYER | CollisionGroup::WALLS); objects_.push_back( oBall ); // orientatation * (original model forward vector) = direction vector oBall->body()->setLinearVelocity( BtOgre::Convert::toBullet(node->getOrientation() * Ogre::Vector3::NEGATIVE_UNIT_Z * speed)); oBall->body()->setRestitution(1.0); oBall->body()->activate(true); projectiles_[oBall->entity_name()] = Projectile(oBall, 3.0); }
Ogre::Vector3 CharacterController::_collideWithWorld(int recursionDepth, const Ogre::Vector3& pos, const Ogre::Vector3& vel, CollisionPacket& colData, bool gravityStep, const Ogre::Degree& slopeSlideThresold) { // do we need to worry? if (recursionDepth > 5) return pos; // Ok, we need to worry: colData.velocity = vel; colData.normalizedVelocity = vel; colData.normalizedVelocity.normalise(); colData.basePoint = pos; colData.foundCollision = false; // ---------------------------- // OgreOpcode part begin _doOgreOpcodeCollision(colData, mVeryCloseDistance); // OgreOpcode part end // ---------------------------- // If no collision we just move along the velocity if (colData.foundCollision == false) { return pos + vel; } // *** Collision occured *** // The original destination point Ogre::Vector3 destinationPoint = pos + vel; Ogre::Vector3 newBasePoint = pos; // only update if we are not already very close // and if so we only move very close to intersection..not // to the exact spot. if (colData.nearestDistance >= mVeryCloseDistance) { Ogre::Vector3 V = vel; V.normalise(); V = V * (colData.nearestDistance - mVeryCloseDistance); newBasePoint = colData.basePoint + V; // Adjust polygon intersection point (so sliding // plane will be unaffected by the fact that we // move slightly less than collision tells us) V.normalise(); colData.intersectionPoint -= mVeryCloseDistance * V; } // Determine the sliding plane Ogre::Vector3 slidePlaneOrigin = colData.intersectionPoint; Ogre::Vector3 slidePlaneNormal = newBasePoint - colData.intersectionPoint; slidePlaneNormal.normalise(); Ogre::Plane slidingPlane(slidePlaneNormal, slidePlaneOrigin); Ogre::Vector3 newDestinationPoint = destinationPoint - slidingPlane.getDistance(destinationPoint) * slidePlaneNormal; // Generate the slide vector, which will become our new // velocity vector for the next iteration Ogre::Vector3 newVelocityVector = newDestinationPoint - colData.intersectionPoint; // Recurse: // dont recurse if the new velocity is very small if (newVelocityVector.length() < mVeryCloseDistance) { return newBasePoint; } // simulate "friction" if (gravityStep) { // apply gravity only if slope is steep enough const Ogre::Radian tolerance = Ogre::Radian(slopeSlideThresold); Ogre::Vector3 gravity = vel; gravity.normalise(); if (slidePlaneNormal.directionEquals(-gravity, tolerance)) { return newBasePoint; } } return _collideWithWorld(recursionDepth++, newBasePoint, newVelocityVector, colData, gravityStep, slopeSlideThresold); }
/// @brief Loads the lighting system for the supplied arena. /// @param aid The ArenaID of the arena to load. void SceneSetup::loadArenaLighting (ArenaID aid) { Ogre::Degree sunRotation; // rotation horizontally (yaw) from +x axis Ogre::Degree sunPitch; // rotation downwards (pitch) from horizontal float sunBrightness[4]; // RGBA float sunSpecular[4]; // RGBA float sunAmbience[4]; // RGBA std::string skyBoxMap; float sf; // scaling factor // Set lighting constants if (aid == COLOSSEUM_ARENA) { sunRotation = -170; sunPitch = 60; sunBrightness[0] = 233; sunBrightness[1] = 225; sunBrightness[2] = 201; sunBrightness[3] = 700; sunSpecular[0] = 233; sunSpecular[1] = 225; sunSpecular[2] = 201; sunSpecular[3] = 400; sunAmbience[0] = 241; sunAmbience[1] = 228; sunAmbience[2] = 190; sunAmbience[3] = 500; skyBoxMap = "arena1_skybox"; } else if (aid == FOREST_ARENA) { sunRotation = 43; sunPitch = 45; sunBrightness[0] = 255; sunBrightness[1] = 232; sunBrightness[2] = 208; sunBrightness[3] = 650; sunSpecular[0] = 255; sunSpecular[1] = 232; sunSpecular[2] = 208; sunSpecular[3] = 300; sunAmbience[0] = 183; sunAmbience[1] = 201; sunAmbience[2] = 206; sunAmbience[3] = 400; skyBoxMap = "arena2_skybox"; } else // Quarry { sunRotation = -55; sunPitch = 35; sunBrightness[0] = 255; sunBrightness[1] = 255; sunBrightness[2] = 249; sunBrightness[3] = 550; sunSpecular[0] = 255; sunSpecular[1] = 255; sunSpecular[2] = 255; sunSpecular[3] = 250; sunAmbience[0] = 172; sunAmbience[1] = 196; sunAmbience[2] = 204; sunAmbience[3] = 200; skyBoxMap = "arena3_skybox"; } // Setup the lighting colours sf = (1.0f / 255.0f) * (sunAmbience[3] / 1000.0f); Ogre::ColourValue sunAmbienceColour = Ogre::ColourValue(sunAmbience[0] * sf, sunAmbience[1] * sf, sunAmbience[2] * sf); sf = (1.0f / 255.0f) * (sunBrightness[3] / 1000.0f); Ogre::ColourValue sunBrightnessColour = Ogre::ColourValue(sunBrightness[0] * sf, sunBrightness[1] * sf, sunBrightness[2] * sf); sf = (1.0f / 255.0f) * (sunSpecular[3] / 1000.0f); Ogre::ColourValue sunSpecularColour = Ogre::ColourValue(sunSpecular[0] * sf, sunSpecular[1] * sf, sunSpecular[2] * sf); // Calculate the sun direction (using rotation matrices). Ogre::Real cos_pitch = Ogre::Math::Cos(sunPitch); Ogre::Real sin_pitch = Ogre::Math::Sin(sunPitch); Ogre::Real cos_yaw = Ogre::Math::Cos(sunRotation); Ogre::Real sin_yaw = Ogre::Math::Sin(sunRotation); Ogre::Matrix3 Rz(cos_pitch, -sin_pitch, 0, sin_pitch, cos_pitch, 0, 0, 0, 1); Ogre::Matrix3 Ry( cos_yaw, 0, sin_yaw, 0, 1, 0, -sin_yaw, 0, cos_yaw); Ogre::Vector3 sunDirection = Ry * Rz * Ogre::Vector3(-1, 0, 0); sunDirection.normalise(); // Set the ambient light. GameCore::mSceneMgr->setAmbientLight(sunAmbienceColour); // Add a directional light (for the sun). mWorldSun->setDiffuseColour(sunBrightnessColour); mWorldSun->setSpecularColour(sunSpecularColour); mWorldSun->setDirection(sunDirection); mWorldSun->setCastShadows(true); // Create the skybox GameCore::mSceneMgr->setSkyBox(true, skyBoxMap, 1000); }
void TFDisplay::updateFrame(FrameInfo* frame) { tf::Stamped<tf::Pose> pose( btTransform( btQuaternion( 0, 0, 0 ), btVector3( 0, 0, 0 ) ), ros::Time(), frame->name_ ); if (tf_->canTransform(fixed_frame_, frame->name_, ros::Time())) { try { tf_->transformPose( fixed_frame_, pose, pose ); } catch(tf::TransformException& e) { ROS_ERROR( "Error transforming frame '%s' to frame '%s'\n", frame->name_.c_str(), fixed_frame_.c_str() ); } } frame->position_ = Ogre::Vector3( pose.getOrigin().x(), pose.getOrigin().y(), pose.getOrigin().z() ); frame->robot_space_position_ = frame->position_; robotToOgre( frame->position_ ); btQuaternion quat; pose.getBasis().getRotation( quat ); frame->orientation_ = Ogre::Quaternion( quat.w(), quat.x(), quat.y(), quat.z() ); frame->robot_space_orientation_ = frame->orientation_; robotToOgre( frame->orientation_ ); frame->axes_->setPosition( frame->position_ ); frame->axes_->setOrientation( frame->orientation_ ); frame->name_node_->setPosition( frame->position_ ); frame->position_property_->changed(); frame->orientation_property_->changed(); std::string old_parent = frame->parent_; frame->parent_.clear(); bool has_parent = tf_->getParent( frame->name_, ros::Time(), frame->parent_ ); if ( has_parent ) { if ( !frame->tree_property_ || old_parent != frame->parent_ ) { M_FrameInfo::iterator parent_it = frames_.find( frame->parent_ ); if ( parent_it != frames_.end() ) { FrameInfo* parent = parent_it->second; if ( parent->tree_property_ ) { property_manager_->deleteProperty( frame->tree_property_ ); frame->tree_property_ = property_manager_->createCategory( frame->name_, property_prefix_ + frame->name_ + "Tree", parent->tree_property_, this ); } } } if ( show_arrows_ ) { tf::Stamped<tf::Pose> parent_pose( btTransform( btQuaternion( 0, 0, 0 ), btVector3( 0, 0, 0 ) ), ros::Time(), frame->parent_ ); if (tf_->canTransform(fixed_frame_, frame->parent_, ros::Time())) { try { tf_->transformPose( fixed_frame_, parent_pose, parent_pose ); } catch(tf::TransformException& e) { ROS_ERROR( "Error transforming frame '%s' to frame '%s'\n", frame->parent_.c_str(), fixed_frame_.c_str() ); } } Ogre::Vector3 parent_position = Ogre::Vector3( parent_pose.getOrigin().x(), parent_pose.getOrigin().y(), parent_pose.getOrigin().z() ); robotToOgre( parent_position ); Ogre::Vector3 direction = parent_position - frame->position_; float distance = direction.length(); direction.normalise(); Ogre::Quaternion orient = Ogre::Vector3::NEGATIVE_UNIT_Z.getRotationTo( direction ); Ogre::Vector3 old_pos = frame->parent_arrow_->getPosition(); // The set() operation on the arrow is rather expensive (has to clear/regenerate geometry), so // avoid doing it if possible bool distance_changed = abs(distance - frame->distance_to_parent_) > 0.0001f; if ( distance_changed ) { frame->distance_to_parent_ = distance; float head_length = ( distance < 0.1 ) ? (0.1*distance) : 0.1; float shaft_length = distance - head_length; frame->parent_arrow_->set( shaft_length, 0.01, head_length, 0.08 ); frame->parent_arrow_->setShaftColor( 0.8f, 0.8f, 0.3f, 1.0f ); frame->parent_arrow_->setHeadColor( 1.0f, 0.1f, 0.6f, 1.0f ); frame->parent_arrow_->setUserData( Ogre::Any( (void*)this ) ); } if ( distance > 0.001f ) { frame->parent_arrow_->getSceneNode()->setVisible( show_arrows_ ); } else { frame->parent_arrow_->getSceneNode()->setVisible( false ); } frame->parent_arrow_->setPosition( frame->position_ ); frame->parent_arrow_->setOrientation( orient ); } else { frame->parent_arrow_->getSceneNode()->setVisible( false ); } } else { if ( !frame->tree_property_ || old_parent != frame->parent_ ) { property_manager_->deleteProperty( frame->tree_property_ ); frame->tree_property_ = property_manager_->createCategory( frame->name_, property_prefix_ + frame->name_ + "Tree", tree_category_, this ); } frame->parent_arrow_->getSceneNode()->setVisible( false ); } frame->parent_property_->changed(); }
void MumbleIntegration::update(Ogre::Vector3 cameraPos, Ogre::Vector3 cameraDir, Ogre::Vector3 cameraUp, Ogre::Vector3 avatarPos, Ogre::Vector3 avatarDir, Ogre::Vector3 avatarUp) { if (! lm) return; if (lm->uiVersion != 2) { wcsncpy(lm->name, L"Rigs of Rods", 256); wcsncpy(lm->description, L"This plugin links Rigs of Rods with Mumble", 2048); lm->uiVersion = 2; } lm->uiTick++; // Left handed coordinate system ( http://wiki.mumble.info/index.php?title=Link#Coordinate_system ) // X positive towards "right". // Y positive towards "up". // Z positive towards "front". // // 1 unit = 1 meter // OGRE uses right-handed coordinate system ( http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+1&structure=Tutorials ) // X positive towards "right". // Y positive towards "up". // Z positive towards "back". => conversion necessary! // // 1 unit = 1 meter (in RoR) // We need unit vectors avatarDir.normalise(); avatarUp.normalise(); cameraDir.normalise(); cameraUp.normalise(); // Position of the avatar lm->fAvatarPosition[0] = avatarPos.x; lm->fAvatarPosition[1] = avatarPos.y; lm->fAvatarPosition[2] = -avatarPos.z; // Unit vector pointing out of the avatars eyes lm->fAvatarFront[0] = avatarDir.x; lm->fAvatarFront[1] = avatarDir.y; lm->fAvatarFront[2] = -avatarDir.z; // Unit vector pointing out of the top of the avatars head lm->fAvatarTop[0] = avatarUp.x; lm->fAvatarTop[1] = avatarUp.y; lm->fAvatarTop[2] = -avatarUp.z; // Same as avatar but for the camera. lm->fCameraPosition[0] = cameraPos.x; lm->fCameraPosition[1] = cameraPos.y; lm->fCameraPosition[2] = -cameraPos.z; lm->fCameraFront[0] = cameraDir.x; lm->fCameraFront[1] = cameraDir.y; lm->fCameraFront[2] = -cameraDir.z; lm->fCameraTop[0] = cameraUp.x; lm->fCameraTop[1] = cameraUp.y; lm->fCameraTop[2] = -cameraUp.z; // Identifier which uniquely identifies a certain player in a context (e.g. the ingame Name). std::string playername = SSETTING("Nickname", "Anonymous").c_str(); std::wstring wplayername; wplayername.assign(playername.begin(), playername.end()); wcsncpy(lm->identity, wplayername.c_str(), 256); // Context should be equal for players which should be able to hear each other _positional_ and // differ for those who shouldn't (e.g. it could contain the server+port and team) // This ensures that Mumble users in the same channel playing on different servers // don't hear each other positional since the positional information would be wrong // TODO: Right now we only create contexts based on server identification but // some servers allow players to play on different maps independently // so we should take that into account as well int teamID = 0; // RoR currently doesn't have any kind of team-based gameplay sprintf((char *)lm->context, "%s:%s|%d", SSETTING("Server name", "-").c_str(), SSETTING("Server port", "1337").c_str(), teamID); lm->context_len = (int)strnlen((char *)lm->context, 256); }
void Lightning::create() { remove(); Ogre::Vector3 end = mOrigin + mDirection*mLength; Ogre::Vector3 current, last = mOrigin; // Create ray segments for(Ogre::uint32 k = 1; k < mDivisions+1; k++) { Ogre::Vector3 current = mOrigin + mDirection*mLength*(static_cast<Ogre::Real>(k)/mDivisions); current += (mLength/(mDivisions*3))*Ogre::Vector3( Ogre::Math::RangeRandom(-1, 1), Ogre::Math::RangeRandom(-1, 1), Ogre::Math::RangeRandom(-1, 1)); mSegments.push_back(Segment(last, current)); mRealLength += (current-last).length(); last = current; } // Create the associated billboard set mBillboardSet = mSceneManager->createBillboardSet(); mBillboardSet->setMaterialName("SkyX_Lightning"); mBillboardSet->setBillboardType(Ogre::BBT_ORIENTED_SELF); Ogre::Real width = mWidthMultiplier*3*(static_cast<Ogre::Real>(mRecursivity)/4+1)*Ogre::Math::RangeRandom(0.5f, 2.5f-mRecursivity/3); // Create the associated billboard for each segment Ogre::Real delta; Ogre::Vector2 bounds; Ogre::Billboard* bb; for(Ogre::uint32 k = 0; k < mSegments.size(); k++) { delta = 1.0f / mSegments.size(); bounds = Ogre::Vector2(k*delta,(k+1)*delta); bounds = Ogre::Vector2(mBounds.x, mBounds.x) + bounds*(mBounds.y-mBounds.x); bb = mBillboardSet->createBillboard((mSegments.at(k).a+mSegments.at(k).b)/2); bb->setDimensions(width, (mSegments.at(k).a-mSegments.at(k).b).length()); bb->setColour(Ogre::ColourValue(0,bounds.x,bounds.y)); bb->mDirection = (mSegments.at(k).a-mSegments.at(k).b).normalisedCopy(); bb = mBillboardSet->createBillboard(mSegments.at(k).a + (mSegments.at(k).a-mSegments.at(k).b).normalisedCopy()*width/2); bb->setDimensions(width, width); bb->setColour(Ogre::ColourValue(1,bounds.x,bounds.x)); bb->mDirection = (mSegments.at(k).a-mSegments.at(k).b).normalisedCopy(); bb = mBillboardSet->createBillboard(mSegments.at(k).b - (mSegments.at(k).a-mSegments.at(k).b).normalisedCopy()*width/2); bb->setDimensions(width, width); bb->setColour(Ogre::ColourValue(1,bounds.y,bounds.y)); bb->mDirection = -(mSegments.at(k).a-mSegments.at(k).b).normalisedCopy(); width *= 1-(1.0f/(mRecursivity*mRecursivity))*(1.0f/mSegments.size()); } mBillboardSet->_updateBounds(); mSceneNode->attachObject(mBillboardSet); mBillboardSet->setCustomParameter(0, Ogre::Vector4(1,0,0,0)); // Ramifications if (mRecursivity > 0) { Ogre::Real angle; Ogre::Vector3 dir; Ogre::Real lengthMult; for (Ogre::uint32 k = 0; k < mDivisions-1; k++) { angle = (mSegments.at(k).b-mSegments.at(k).a).normalisedCopy().dotProduct( ((mSegments.at(k+1).b-mSegments.at(k+1).a).normalisedCopy())); if (angle < Ogre::Math::RangeRandom(mAngleRange.x, mAngleRange.y)) { dir = (mSegments.at(k).b-mSegments.at(k).a).normalisedCopy(); dir.x *= Ogre::Math::RangeRandom(0.8f, 1.2f); dir.y *= Ogre::Math::RangeRandom(0.8f, 1.2f); dir.z *= Ogre::Math::RangeRandom(0.8f, 1.2f); dir.normalise(); delta = 1.0f / mSegments.size(); bounds = Ogre::Vector2(mBounds.x+(mBounds.y-mBounds.x)*(k+1)*delta,1); lengthMult = Ogre::Math::RangeRandom(0.1f, 0.7f); Lightning* lightning = new Lightning(mSceneManager, mSceneNode, mSegments.at(k).b, dir, lengthMult*mLength, 2+mDivisions*lengthMult, mRecursivity-1, mTimeMultiplier, mWidthMultiplier, bounds); lightning->create(); mChildren.push_back(lightning); } } } mCreated = true; }
BOOL CCameraController::UpdateCameraControl() { if (m_bLocked) { return TRUE; } Vector3 vtNewPos = m_pBindObject->GetPosition(); if((m_vtBindObjPos == vtNewPos)&&(!m_bPositionUpate)&&!m_bMoveCameraFar&&!m_bMoveCameraNear) { return TRUE; } if(m_bMoveCameraNear) { m_fDistance -= 0.05; } if(m_bMoveCameraFar) { m_fDistance += 0.05; } m_vtBindObjPos = vtNewPos; m_vecDstPos = m_vecUnitDir * m_fDistance + m_vtBindObjPos; Ogre::Vector3 RayDir = m_vecDstPos-vtNewPos; RayDir.normalise(); Ogre::Ray SearchRay; SearchRay.setOrigin(vtNewPos); SearchRay.setDirection(RayDir); g_Debuginfo.PrintfInfo("m_vecDstPos x:%.2f-y:%.2f-z:%.2f!||", m_vecDstPos.x,m_vecDstPos.y,m_vecDstPos.z); Ogre::TerrainGroup::RayResult rayResult = CGameApp::GetGameApp()->m_World.m_pTerrainGroup->rayIntersects(SearchRay); if(rayResult.hit) { if((rayResult.position-vtNewPos).length()<m_fDistance) { m_vecDstPos = rayResult.position; m_vecDstPos .y += 1; g_Debuginfo.PrintfInfo("hit -- rayResult x:%.2f--y:%.2f--z:%.2f!\n", rayResult.position.x,rayResult.position.y,rayResult.position.z); } else { g_Debuginfo.PrintfInfo("hit --rayResult x:1--y:1--z:1!\n"); } } else { g_Debuginfo.PrintfInfo("unhit --rayResult x:0--y:0--z:0!\n"); } m_pCamera->lookAt(vtNewPos+Vector3(0,1.5,0)); m_pCamera->setPosition(m_vecDstPos); m_bPositionUpate = FALSE; return TRUE; }
//michael wander code //code taken and adapted from http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-wander--gamedev-1624 //written by Michael Kong void Tank::wander(const float& deltaTime){ float circleDistance = 200.f; Ogre::Vector3 circleCenter; float radius = 20.f; std::random_device rd; std::mt19937 random(rd()); Ogre::Quaternion tankOrientation = mTankBodyNode->getOrientation(); Ogre::Vector3 currentDirection = tankOrientation * Ogre::Vector3::NEGATIVE_UNIT_X; currentDirection.normalise(); circleCenter = currentDirection * circleDistance; Ogre::Vector3 displacement = Ogre::Vector3::UNIT_Z * radius; float length = displacement.length(); displacement.x = cos(wanderAngle) * length; displacement.z = sin(wanderAngle) * length; displacement.y = 13; std::uniform_real_distribution<double> randomGen; wanderAngle += randomGen(random) * ANGLE_CHANGE - ANGLE_CHANGE * 0.5f; Ogre::Vector3 steering = circleCenter + displacement; steering.normalise(); steering *= ms; circleCenter.y = 13.f; mTankBodyNode->lookAt(displacement, Ogre::Node::TransformSpace::TS_WORLD); mTankBodyNode->translate(steering * deltaTime); /* Ogre::Vector3 rayDest; rayDest = mTankBodyNode->getOrientation() * Ogre::Vector3(1,0,0); bool check = false; Ogre::Ray shootToCheckWall = Ogre::Ray(mTankBodyNode->getPosition(), rayDest); Ogre::RaySceneQuery* mRaySceneQuery = mSceneMgr->createRayQuery(shootToCheckWall, Ogre::SceneManager::ENTITY_TYPE_MASK); mRaySceneQuery->setSortByDistance(true); // Ray-cast and get first hit Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute(); Ogre::RaySceneQueryResult::iterator itr = result.begin(); bool hit = false; for (itr = result.begin(); itr != result.end(); itr++) { std::string x = itr->movable->getName(); printf("Check %s \n", x.c_str()); if (x[0] == 'C' && itr->distance < 10) { printf("Too close to %s: %f \n", x.c_str(), (float)itr->distance); hit = true; } } if(hit == true) { mTankBodyNode->yaw(Ogre::Degree(180)); mTankBodyNode->translate((mTankBodyNode->getPosition() * Ogre::Vector3(-1,0,0)) * deltaTime ); } else if (hit == false) { check = true; } */ }
void AIInConeAttackStrategy::Step(unsigned timeMs) { IScenable *scen = Parent->GetScenable(); if (TargetID<0) { return; } if (TargetID==0) { if (Owner) { TargetID = Owner->SelectTargetID(); } if (TargetID<=0) { TargetID=-1; IEquipped *eq = Parent->GetEquipped(); eq->SetTargetPosition(Ogre::Vector3::ZERO); eq->SetShooting(false); return; } } IAAObject *obj = CommonDeclarations::GetIDObject(TargetID); if (NULL==obj) { TargetID=0; return; } IScenable* Target; Target = obj->GetScenable(); if (NULL==Target/* || phys->IsCollided()*/) return; if(RotationUnit.mRotating) { RotationUnit.Step(); if(RotationUnit.mRotating) // Process timed rotation { Ogre::Quaternion delta = RotationUnit.Slerp(); scen->SetOrientation(delta); } }// else { int actual_rotation_speed = RotationSpeed; IPhysical *phys = Parent->GetPhysical(); AICommander *commander = Owner->GetCommander(); Ogre::Vector3 src = Ogre::Vector3::ZERO; if (commander) { IAAObject *obj = commander->GetParent(); if (obj) { IScenable *scen = obj->GetScenable(); if (scen) { src = scen->GetOrientation()*Ogre::Vector3::NEGATIVE_UNIT_Z; } } } else { src = -phys->GetForwardDirection(); //OurOrientation * Ogre::Vector3::NEGATIVE_UNIT_Z; } Ogre::Vector3 direction = Target->GetPosition()-scen->GetPosition(); direction.normalise(); Ogre::Real cs = src.dotProduct(direction); if (src.isZeroLength() || cs>=AngleCosinusModule) { actual_rotation_speed = actual_rotation_speed/2; /*char log[100]; sprintf(log,"in cone %f %f %f\n",direction.x, direction.y, direction.z); Debugging::Log("icas",log);*/ } else { direction = src; /*char log[100]; sprintf(log,"not in cone %f %f %f\n",direction.x, direction.y, direction.z); Debugging::Log("icas",log);*/ } Ogre::Vector3 up =CommonDeclarations::GetUpVector(); Ogre::Quaternion OurOrientation = scen->GetOrientation(); Vector3 xVec = up.crossProduct(direction); xVec.normalise(); Vector3 yVec = direction.crossProduct(xVec); yVec.normalise(); Quaternion unitZToTarget = Quaternion(xVec, yVec, direction); Quaternion targetOrientation = Quaternion(-unitZToTarget.y, -unitZToTarget.z, unitZToTarget.w, unitZToTarget.x); RotationUnit.StartRotation(OurOrientation, targetOrientation, actual_rotation_speed); } std::pair<bool, Ogre::Real> intersection_res; IEquipped *eq = Parent->GetEquipped(); Ogre::Ray pl_ray = eq->GetSightRay(); intersection_res = pl_ray.intersects(Target->GetBoundingBox(true)); if (intersection_res.first) { eq->SetTargetPosition(Target->GetPosition(), intersection_res.second); eq->SetShooting(true); } else { eq->SetTargetPosition(Ogre::Vector3::ZERO); eq->SetShooting(false); } }
bit GameVisualScene::init( Game* game ) { game->visualSystem.lockThread(); game->visualSystem.loadResources("InGame"); Ogre::Viewport* vp = game->visualSystem.getPrimaryRenderWindow()->getViewport(0); Ogre::CompositorManager* compositorMgr = Ogre::CompositorManager::getSingletonPtr(); Ogre::CompositorInstance* compositor = compositorMgr->addCompositor(vp,"LuminanceBloom"); compositorMgr->setCompositorEnabled(vp,"LuminanceBloom",true); VisualScene::init(game); Ogre::Light* light = game->visualSystem.getSceneMgr()->createLight("MainLight"); light->setType(Ogre::Light::LT_DIRECTIONAL); light->setPosition(800,900,-550); Ogre::Vector3 dir = -light->getPosition(); dir.normalise(); light->setDirection(dir); light->setSpecularColour(1.0f,1.0f,1.0f); light->setDiffuseColour(0.8f,0.8f,0.8f); //light->setSpotlightRange(Ogre::Degree(50), Ogre::Degree(75)); light->setPowerScale(1.0f); light->setCastShadows(true); //Ogre::LiSPSMShadowCameraSetup* cameraSetup = new Ogre::LiSPSMShadowCameraSetup; //game->visualSystem.getSceneMgr()->setShadowCameraSetup(Ogre::ShadowCameraSetupPtr(cameraSetup)); game->visualSystem.getSceneMgr()->getRootSceneNode()->attachObject(light); game->visualSystem.getSceneMgr()->setAmbientLight(Ogre::ColourValue(0.1,0.90,0.75)); //game->visualSystem.getSceneMgr()->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_ADDITIVE); game->visualSystem.getSceneMgr()->setShadowTextureSize(1024); //game->visualSystem.getSceneMgr()->setShadowTextureSettings(1024,2); game->visualSystem.getSceneMgr()->setShadowFarDistance(24); game->visualSystem.getSceneMgr()->setShadowDirLightTextureOffset(0.05); game->visualSystem.getSceneMgr()->setShadowTextureSelfShadow(false); game->visualSystem.getSceneMgr()->setShadowColour( Ogre::ColourValue(0.75f, 0.75f, 0.75f) ); game->visualSystem.getSceneMgr()->setSkyBox(true,"skybox",1000); game->visualSystem.getSceneMgr()->setShadowTextureCasterMaterial("depthShadowMapCasterMaterial"); //game->visualSystem.getSceneMgr()->setShadowTextureCasterMaterial("VarianceShadowMapping/ShadowCaster"); game->visualSystem.getSceneMgr()->setShadowTexturePixelFormat(PF_FLOAT32_R); game->visualSystem.getSceneMgr()->setShadowCasterRenderBackFaces(true); game->visualSystem.getSceneMgr()->setShadowTechnique(SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED); Bridge* bridge = new Bridge(game); bridge->init("bridge"); RoadBarrier* barrier[20]; for(u32 i=0 ; i<20 ; i++) { barrier[i] = new RoadBarrier(game); barrier[i]->init("barrier"+IntToStr(i)); } hkQuaternion q; q.setAxisAngle(hkVector4(0,1,0),Deg2Rad(90)); barrier[0]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,-50.0),q); barrier[1]->getPhysicsEntity()->setPositionAndRotation(hkVector4(4.5,0.51f,-40.0),q); barrier[2]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,-30.0),q); barrier[3]->getPhysicsEntity()->setPositionAndRotation(hkVector4(1.5,0.51f,-20.0),q); barrier[4]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,-10.0),q); barrier[5]->getPhysicsEntity()->setPositionAndRotation(hkVector4(2.5,0.51f,-70.0),q); barrier[6]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,-90.0),q); barrier[7]->getPhysicsEntity()->setPositionAndRotation(hkVector4(0.5,0.51f,100.0),q); barrier[8]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,110.0),q); barrier[9]->getPhysicsEntity()->setPositionAndRotation(hkVector4(5.5,0.51f,40.0),q); barrier[10]->getPhysicsEntity()->setPositionAndRotation(hkVector4(1.5,0.51f,50.0),q); barrier[11]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,60.0),q); barrier[12]->getPhysicsEntity()->setPositionAndRotation(hkVector4(5.5,0.51f,70.0),q); barrier[13]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,80.0),q); barrier[14]->getPhysicsEntity()->setPositionAndRotation(hkVector4(3.5,0.51f,90.0),q); barrier[15]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-5.5,0.51f,100.0),q); barrier[16]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-2.5,0.51f,110.0),q); barrier[17]->getPhysicsEntity()->setPositionAndRotation(hkVector4(-0.5,0.51f,120.0),q); barrier[18]->getPhysicsEntity()->setPositionAndRotation(hkVector4(2.5,0.51f,130.0),q); barrier[19]->getPhysicsEntity()->setPositionAndRotation(hkVector4(5.5,0.51f,140.0),q); Crate* crate[32]; for(u32 i=0 ; i<32 ; i++) { crate[i] = new Crate(game); crate[i]->init("crate"+IntToStr(i)); } crate[0]->getPhysicsEntity()->setPosition(hkVector4(-1.25,0.0f,20.75)); crate[1]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.0f,20.75)); crate[2]->getPhysicsEntity()->setPosition(hkVector4(-2,0.0f,20.75)); crate[3]->getPhysicsEntity()->setPosition(hkVector4(-1,25,0.0f,20.0)); crate[4]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.0f,20.0)); crate[5]->getPhysicsEntity()->setPosition(hkVector4(-2.75,0.0f,20.0)); crate[6]->getPhysicsEntity()->setPosition(hkVector4(-1,25,0.0f,20.75)); crate[7]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.0f,20.75)); crate[8]->getPhysicsEntity()->setPosition(hkVector4(-2.75,0.0f,20.75)); crate[9]->getPhysicsEntity()->setPosition(hkVector4(-1.25,0.5f,20.75)); crate[10]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.5f,20.75)); crate[11]->getPhysicsEntity()->setPosition(hkVector4(-2.75,0.5f,20.75)); crate[12]->getPhysicsEntity()->setPosition(hkVector4(-1,25,0.5f,20.0)); crate[13]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.5f,20.0)); crate[14]->getPhysicsEntity()->setPosition(hkVector4(-2.75,0.5f,20.0)); crate[15]->getPhysicsEntity()->setPosition(hkVector4(-1,25,0.5f,20.750)); crate[16]->getPhysicsEntity()->setPosition(hkVector4(-2 ,0.5f,20.750)); crate[17]->getPhysicsEntity()->setPosition(hkVector4(-2.75,0.5f,20.750)); crate[18]->getPhysicsEntity()->setPosition(hkVector4(-1.25,1.0f,20.75)); crate[19]->getPhysicsEntity()->setPosition(hkVector4(-2 ,1.0f,20.75)); crate[20]->getPhysicsEntity()->setPosition(hkVector4(-2.75,1.0f,20.75)); crate[21]->getPhysicsEntity()->setPosition(hkVector4(-1,25,1.0f,20.0)); crate[22]->getPhysicsEntity()->setPosition(hkVector4(-2 ,1.0f,20.0)); crate[23]->getPhysicsEntity()->setPosition(hkVector4(-2.75,1.0f,20.0)); crate[24]->getPhysicsEntity()->setPosition(hkVector4(-1,25,1.0f,20.75)); crate[25]->getPhysicsEntity()->setPosition(hkVector4(-2 ,1.0f,20.75)); crate[26]->getPhysicsEntity()->setPosition(hkVector4(-2.75,1.0f,20.75)); crate[27]->getPhysicsEntity()->setPosition(hkVector4(-1.25,1.5f,-20.75)); crate[28]->getPhysicsEntity()->setPosition(hkVector4(-20 ,1.5f,-20.75)); crate[29]->getPhysicsEntity()->setPosition(hkVector4(-2.75,1.5f,-20.75)); crate[30]->getPhysicsEntity()->setPosition(hkVector4(-1,25,1.5f,-20.0)); crate[31]->getPhysicsEntity()->setPosition(hkVector4(-2 ,1.5f,-20.0)); //RoadBarrier* barrier = new RoadBarrier(game); //barrier->init("barrier"); //barrier->getPhysicsEntity()->setPosition(hkVector4(-5.5,0.25f,0.0f)); Ogre::OverlayManager* overlayManager = Ogre::OverlayManager::getSingletonPtr(); Ogre::Overlay* overlay = overlayManager->getByName("debugText"); overlay->show(); debugTextOverlay = (Ogre::TextAreaOverlayElement*)overlayManager->getOverlayElement("debugTextArea"); debugTextOverlay->show(); updateCamera(); game->visualSystem.unlockThread(); return true; }