Ejemplo n.º 1
0
void Camera::setCamera(const VisualizationParameterSet& visParams, const int generateCubeMap)
{
  // set the camera
  if(generateCubeMap > 0)
  {
    graphicsManager->setCubeMapCamera(generateCubeMap, graphicsManager->reflectionObject ?
      graphicsManager->reflectionObject->getPosition() : Vector3d());
    return;
  }
  else
  {
    Vector3d forwardVec(1.0,0.0,0.0);
    Vector3d upVec(0.0,0.0,1.0);

    // if the camera is bound to a physical object and motion blur is active
    // the camera needs to be transformed across the render passes
    if(visParams.mb_mode != MOTIONBLUR_OFF)
    {
      if(visParams.mb_mode == MOTIONBLUR_6PASSES ||
          visParams.mb_mode == MOTIONBLUR_12PASSES ||
          visParams.mb_mode == MOTIONBLUR_24PASSES ||
          visParams.mb_mode == MOTIONBLUR_ACCUMULATION)
      {
        if(cycle_order_offset >= 0 && visParams.mb_renderPasses > 1)
        {
          float pos_offset = cycle_order_offset -
            ((float)(visParams.mb_currentPass-1.0f)/(visParams.mb_renderPasses-1.0f))*graphicsManager->getExposure2Physic();
          GLHelper::getGLH()->setInterpolatedCameraLookAt( previous_positions, previous_rotations, pos_offset);
        }
        else
          GLHelper::getGLH()->setMatrix(position, rotation);
      }
      else if(visParams.mb_mode == MOTIONBLUR_VELOCITY_BUFFER ||
        visParams.mb_mode == MOTIONBLUR_VELOCITY_BUFFER_2 ||
        visParams.mb_mode == MOTIONBLUR_VELOCITY_BUFFER_2_GEO)
      {
        forwardVec.rotate(rotation);
        upVec.rotate(rotation);
        gluLookAt(position.v[0], position.v[1], position.v[2], 
                  position.v[0] + forwardVec.v[0],
                  position.v[1] + forwardVec.v[1], 
                  position.v[2] + forwardVec.v[2],
                  upVec.v[0], upVec.v[1], upVec.v[2]);
      }
    }
    else
    {
      forwardVec.rotate(rotation);
      upVec.rotate(rotation);
      gluLookAt(position.v[0], position.v[1], position.v[2], 
                position.v[0] + forwardVec.v[0],
                position.v[1] + forwardVec.v[1], 
                position.v[2] + forwardVec.v[2],
                upVec.v[0], upVec.v[1], upVec.v[2]);
    }
  }
}
U32 ForestWindEmitter::packUpdate(NetConnection * con, U32 mask, BitStream * stream)
{
   U32 retMask = Parent::packUpdate( con, mask, stream );

   mathWrite( *stream, mObjToWorld );

   if ( stream->writeFlag( mask & EnabledMask ) )
      stream->writeFlag( mEnabled );

   if ( stream->writeFlag( mask & WindMask ) )
   {
      stream->write( mWindStrength );

      stream->write( mWindRadius );
      stream->writeFlag( mRadialEmitter );

      stream->write( mWindGustStrength );
      stream->write( mWindGustFrequency );

      stream->write( mWindGustYawAngle );
      stream->write( mWindGustYawFrequency );
      stream->write( mWindGustWobbleStrength );

      stream->write( mWindTurbulenceStrength );
      stream->write( mWindTurbulenceFrequency );

      // The wind direction should be normalized!
      if ( mWindDirection.isZero() )
      {
         VectorF forwardVec( 0, 0, 0 );
         mWorldToObj.getColumn( 1, &mWindDirection );
      }
      else
         mWindDirection.normalize();

      stream->writeNormalVector( mWindDirection, 8 );  

      stream->writeFlag( mHasMount );
   } 

   return retMask;
}
Ejemplo n.º 3
0
void Camera::move(float forward, float right, float up, float upAngle, float leftAngle) {
	position += vec3(0,up,0);

	vec3 forwardVec(
			 sin(horizontalAngle),
			0,
			cos(horizontalAngle)
	);
	vec3 rightVec(
			sin(horizontalAngle - 3.14f/2.0f),
			0,
			cos(horizontalAngle - 3.14f/2.0f)
	);
	position += forwardVec * forward;
	position += rightVec * right;
	horizontalAngle += leftAngle;
	verticalAngle += upAngle;
	updateViewMatrix();
	updateProjectionMatrix();
}
Ejemplo n.º 4
0
void DistanceSensor::renderingInstructions(ImagingBuffer<float>& buffer)
{
  // set viewport
  glViewport(0, 0, buffer.resolutionX, buffer.resolutionY);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(Functions::toDeg(angleY), tan(angleX/2) / tan(angleY/2), minRange, maxRange);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  // clear the viewport
  glClearDepth(1.0);
  Surface* backgroundSurface = simulation->getBackgroundSurface();
  glClearColor(backgroundSurface->color[0], backgroundSurface->color[1],
               backgroundSurface->color[2], backgroundSurface->color[3]);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  // set the visual parameters
  VisualizationParameterSet visParams;
  visParams.surfaceStyle = VisualizationParameterSet::FLAT_SHADING;
  visParams.drawForSensor = true;
  simulation->enableStateDL(visParams.surfaceStyle);

  // set the camera
  Vector3d forwardVec(1.0,0.0,0.0);
  Vector3d upVec(0.0,0.0,1.0);
  forwardVec.rotate(rotation);
  upVec.rotate(rotation);
  gluLookAt(position.v[0], position.v[1], position.v[2], 
            position.v[0] + forwardVec.v[0], position.v[1] + forwardVec.v[1], 
            position.v[2] + forwardVec.v[2],
            upVec.v[0], upVec.v[1], upVec.v[2]);

  glGetDoublev(GL_MODELVIEW_MATRIX, buffer.modelViewMatrix);
  glGetDoublev(GL_PROJECTION_MATRIX, buffer.projectionMatrix);
  glGetIntegerv(GL_VIEWPORT, buffer.viewPort);
  
  rootNode->draw(visParams);
  glFlush();
  simulation->disableStateDL(visParams.surfaceStyle);
}
Ejemplo n.º 5
0
void Actor::walkForward() {
	float dist = g_grim->getPerSecond(_walkRate);
	// Limit the amount of the movement per frame, otherwise with low fps
	// scripts that use WalkActorForward and proximity may break.
	if ((dist > 0 && dist > _walkRate / 5.f) || (dist < 0 && dist < _walkRate / 5.f))
		dist = _walkRate / 5.f;

	_walking = false;

	if (! _constrain) {
		Math::Vector3d forwardVec(-_moveYaw.getSine() * _pitch.getCosine(),
			_moveYaw.getCosine() * _pitch.getCosine(), _pitch.getSine());

		// EMI: Y is up-down, sectors use an X-Z plane for movement
		if (g_grim->getGameType() == GType_MONKEY4) {
			float temp = forwardVec.z();
			forwardVec.z() = forwardVec.y();
			forwardVec.y() = temp;
		}

		_pos += forwardVec * dist;
		_walkedCur = true;
		return;
	}

	bool backwards = false;
	if (dist < 0) {
		dist = -dist;
		backwards = true;
	}

	int tries = 0;
	while (dist > 0.0f) {
		Math::Vector3d forwardVec(-_moveYaw.getSine() * _pitch.getCosine(),
			_moveYaw.getCosine() * _pitch.getCosine(), _pitch.getSine());

		// EMI: Y is up-down, sectors use an X-Z plane for movement
		if (g_grim->getGameType() == GType_MONKEY4) {
			float temp = forwardVec.z();
			forwardVec.z() = forwardVec.y();
			forwardVec.y() = temp;
		}

		if (backwards)
			forwardVec = -forwardVec;

		Sector *currSector = NULL, *prevSector = NULL, *startSector = NULL;
		Sector::ExitInfo ei;

		g_grim->getCurrSet()->findClosestSector(_pos, &currSector, &_pos);
		if (!currSector) { // Shouldn't happen...
			moveTo(_pos + forwardVec * dist);
			_walkedCur = true;
			return;
		}
		startSector = currSector;

		float oldDist = dist;
		while (currSector) {
			prevSector = currSector;
			Math::Vector3d puckVec = currSector->getProjectionToPuckVector(forwardVec);
			puckVec /= puckVec.getMagnitude();
			currSector->getExitInfo(_pos, puckVec, &ei);
			float exitDist = (ei.exitPoint - _pos).getMagnitude();
			if (dist < exitDist) {
				moveTo(_pos + puckVec * dist);
				_walkedCur = true;
				return;
			}
			_pos = ei.exitPoint;
			dist -= exitDist;
			if (exitDist > 0.0001)
				_walkedCur = true;

			// Check for an adjacent sector which can continue
			// the path
			currSector = g_grim->getCurrSet()->findPointSector(ei.exitPoint + (float)0.0001 * puckVec, Sector::WalkType);

			// EMI: some sectors are significantly higher/lower than others.
			if (currSector && g_grim->getGameType() == GType_MONKEY4) {
				float planeDist = currSector->distanceToPoint(_pos);
				if (fabs(planeDist) < 1.f)
					_pos -= planeDist * currSector->getNormal();
			}

			if (currSector == prevSector || currSector == startSector)
				break;
		}

		int turnDir = 1;
		if (ei.angleWithEdge > 90) {
			ei.angleWithEdge = 180 - ei.angleWithEdge;
			ei.edgeDir = -ei.edgeDir;
			turnDir = -1;
		}
		if (ei.angleWithEdge > _reflectionAngle)
			return;

		ei.angleWithEdge += (float)1.0f;
		turnTo(0, _moveYaw + ei.angleWithEdge * turnDir, 0);

		if (oldDist <= dist + 0.001f) {
			// If we didn't move at all, keep trying a couple more times
			// in case we can move in the new direction.
			tries++;
			if (tries > 3)
				break;
		}
	}
}