void CProcessIA4::Render(CRenderManager* rm) 
{
  //eje principal
  Mat44f matWorld;
  matWorld.SetIdentity();
  rm->SetTransform(matWorld);
  rm->DrawAxis(5);

  //mueve eje de IA
  RenderMovIA(rm);

// m_SceneEffectManager->ActivateRenderSceneEffects();

  CEffectManager *l_EffectManager=CORE->GetEffectManager();
  l_EffectManager->SetAnimatedModelTechnique(NULL);
  l_EffectManager->SetStaticMeshTechnique(NULL);
  
  //m_SceneEffectManager->PreRender(rm,this);
  //Renderizamos la escena
  RenderScene(rm);
  CORE->GetPhysicsManager()->DebugRender(rm);
  
/*  m_SceneEffectManager->CaptureFrameBuffers(rm);
  m_SceneEffectManager->PostRender(rm);
  m_SceneEffectManager->CaptureFrameBuffersAfterPostRender(rm);
*/

  RenderDebugInfo(); 
}
void SphereCapLight::getIrradianceSamples(Vec3f point, const Scene* scene, vector<LightRay>& result, float time) {
	// Calculate cap heigth
	float connectionSq = (point - location).length2();
	float connection = sqrt(connectionSq);
	float tangentSq = connectionSq - radius*radius;
	float heightToPoint = tangentSq / connection;
	auto sphereWarping = std::unique_ptr<Warping>(new UniformSphereCapWarping((radius - (connection-heightToPoint)) / radius));

	// Calculate rotation
	Vec3f dir = (point - location).normalized();
	Mat44f rotation = Mat44f(1);
	rotation.rotateTo(Vec3f(0,0,1), dir);

	// Draw new samples
	std::vector<Vec2f> drawnPoints(nSamples);
	randomSampler->generateSamples(nSamplesSqrt, drawnPoints);
	
	Color3f sum = Color3f(0);
	for (unsigned int i = 0; i < nSamples; i++) {
		// Warp and rotate samples
		if (point.x < 0 && point.y > 0)
			int a = 0;
		Vec3f warpedPoint = rotation * sphereWarping->warp(drawnPoints[i]);
		Vec3f spherePoint = warpedPoint * radius;

		Vec3f difference = point - (spherePoint + location);
		float distance = difference.length();

		LightRay lr;
		Ray r;
		lr.direction = difference / distance;
		r.d = lr.direction;
		r.o = spherePoint + location;
		r.tMax = distance - r.tMin;
		r.time = time;

		// Check for intersection
		for (unsigned int k = 0; k < scene->shapes.size(); k++) {
			scene->shapes[k]->intersect(&r);
		}

		//if ray hit something then it does not contribute
		if (r.hit.shape == 0) {
			float pdf = sphereWarping->pdf(drawnPoints[i]);
			//lr.radiance = power * dot(lr.direction, warpedPoint) / (sphereWarping->pdf(drawnPoints[i]) * 4*PI * pow(distance+radius, 2));
			float a = 1/(sphereWarping->pdf(drawnPoints[i]) * 4*PI);
			lr.radiance = radiance * 4 * pow(radius,2) * std::max(0.f,dot(lr.direction, warpedPoint)) / (sphereWarping->pdf(drawnPoints[i]) * 4*PI * pow(distance, 2));
		}
		else {
			lr.radiance = Color3f(0);
		}
		result.push_back(lr);
	}
}
Beispiel #3
0
void CObject3D::SetMat44(Mat44f _vMat44) 
{
  m_vMat44 = _vMat44;
  //m_fPitch = _vMat44.GetPitch();
  //m_fYaw = -_vMat44.GetYaw();
  //m_fRoll = _vMat44.GetRoll();
  m_fPitch =  _vMat44.GetAngleZ();
  m_fYaw   = _vMat44.GetAngleY();
  m_fRoll  =  _vMat44.GetAngleX();
  m_vPosition = _vMat44.GetPos();
}
Beispiel #4
0
void CInstanceMesh::Render(CRenderManager *RM)
{
	if(GetVisible())
	{
		/*OJUCUIDAO*/ //Exportem els vertex dels objectes en un espai real, per tant si els transformem amb pos rot i scale es lia
					  //Exportamos los vertices de los objetos en espacio real, asi que al aplicarles la transformada con pos rot y scale, se lia parda
		//RM->GetContextManager()->SetWorldMatrix(GetTransform());
		Mat44f world;
		world.SetIdentity();
		RM->GetContextManager()->SetWorldMatrix(world);
		m_StaticMesh->Render(RM);
	}
}
TracePhoton RectangularLight::samplePhoton() {
	std::vector<Vec2f> samples(2);
	randomSampler->generateSamples(2, samples);

	Mat44f rot = Mat44f::I();
	rot.rotateTo(Vec3f(0,0,1), Vec3f(0,-1,0));
	
	Vec3f warpedPoint = Vec3f(size.x*samples[0].x + minPosition.x, minPosition.y, size.y*samples[0].y + minPosition.z);
	Vec3f warpedDirection = rot * cosineWarping->warp(samples[1]);

	TracePhoton photon = TracePhoton(warpedPoint, warpedDirection, power);

	return photon;
}
void CSpirit::Render(CRenderManager* rm)
{
  CRenderableObject* player = CORE->GetRenderableObjectsManager()->GetInstance("mi_amigo");

  Vect3f a(player->GetPosition().x,player->GetPosition().y,player->GetPosition().z); 

  Mat44f vecOptimo;
  vecOptimo.SetIdentity();
  rm->SetTransform(vecOptimo);

  rm->DrawLine(a,a+ m_vecPlayer,colWHITE);
  rm->DrawLine(a, a +m_vecSpirit,colRED);

}
Beispiel #7
0
void CPhysXProcess::RenderPhysX(CRenderManager* _pRM, CRenderableObject* _pRO, Mat44f _mMatTransf)
{
    //_pRO->GetBoundingBox()->GetMiddlePoint();
   Mat44f t;
   t.SetIdentity();

   t.Translate(Vect3f(0.0f,-_pRO->GetBoundingBox()->GetMiddlePoint().y,0.0f));
   _pRM->SetTransform(_mMatTransf*t);
   //(StaticMesh*)
   

   CInstanceMesh* l_pInstanceMesh = (CInstanceMesh*)_pRO;
   //l_pInstanceMesh->RenderRenderableObject(_pRM);
  // _pRM->RenderBoundingBox(l_pInstanceMesh->GetBoundingBox());
}
Color3f AmbientOcclusionShader::shade(const HitInfo & hit, const Scene* scene, stack<float>& refractionIndices) const {
	// Draw new samples
	std::vector<Vec2f> drawnPoints(nSamples);
	currentSampler->generateSamples(nSamplesSqrt, drawnPoints);
	
	// Calculate rotation
	Mat44f rotation = Mat44f(1);
	rotation.rotateTo(Vec3f(0,0,1), hit.N);

	Color3f sum = Color3f(0);
	for (size_t i = 0; i < nSamples; i++) {
		Vec3f warpedPoint;
		// Include the environment Map weighting
		if (environmentMapWeighted) {
			warpedPoint = scene->background->importanceSample(drawnPoints[i]);
			while (dot(warpedPoint, hit.N) < 0) {
				std::vector<Vec2f> sample(1);
				currentSampler->generateSamples(1, sample);
				warpedPoint = scene->background->importanceSample(sample.front());
			}
		}
		else {
			// Warp and rotate samples
			warpedPoint = rotation * currentWarping->warp(drawnPoints[i]);
		}
		Ray r(hit.P, warpedPoint);
		r.time = hit.time;

		// Check for intersection
		for (unsigned int k = 0; k < scene->shapes.size(); k++) {
			scene->shapes[k]->intersect(&r);
		}

		//if ray hit something then it does not contribute
		if (r.hit.shape == 0) {
			if (cosineWeighted)
				sum += Vec3f(scene->background->getBackground(r.d).toArray());
			else
				sum += Vec3f(scene->background->getBackground(r.d).toArray()) * dot(warpedPoint, hit.N);
		}
	}

	if (!cosineWeighted)
		sum *= 2;

	return sum / static_cast<float>(nSamples);
}
Beispiel #9
0
void CEffect::SetValue(const string& _szParameterName,Mat44f _matValue)
{
  D3DXHANDLE l_pParameter = 0;
  l_pParameter = m_pD3DEffect->GetParameterBySemantic(NULL,_szParameterName.c_str());

  if(l_pParameter)
  {
    m_pD3DEffect->SetMatrix(l_pParameter,&(_matValue.GetD3DXMatrix()));
  }
}
CBoundingBox CPhysxSkeleton::ComputeBoundingBox()
{
  vector<CPhysxBone*>::iterator l_it  = m_vBones.begin();
  vector<CPhysxBone*>::iterator l_end = m_vBones.end();
  Mat44f m;
  bool m_bFirst = true;
  Vect3f v, min, max;

  for(; l_it != l_end; ++l_it)
  {
    CPhysicActor* l_pPA = (*l_it)->GetPhysxActor();
    if(l_pPA)
    {
      l_pPA->GetMat44(m);
      v = m.GetTranslationVector();
      v += (*l_it)->GetMiddlePoint();
      if(m_bFirst)
      {
        min = max = v;
        m_bFirst = false;
      }
      else
      {
        min.x = (min.x < v.x) ? min.x : v.x;
        min.y = (min.y < v.y) ? min.y : v.y;
        min.z = (min.z < v.z) ? min.z : v.z;

        max.x = (max.x > v.x) ? max.x : v.x;
        max.y = (max.y > v.y) ? max.y : v.y;
        max.z = (max.z > v.z) ? max.z : v.z;
      }
    }
  }

  CBoundingBox l_BB;
  l_BB.Init(min, max);

  return l_BB;
}
Beispiel #11
0
void CPhysXProcess::RenderImpacts(CRenderManager* _pRM)
{
  Mat44f t;  
  for (int i=0;i<(int)g_vCollisions.size();++i)
  {

      t.SetIdentity();
      t.Translate(g_vCollisions[i].m_CollisionPoint);
      _pRM->SetTransform(t);
      if (i==8)
      {
        _pRM->DrawSphere(0.015f,colRED,5);
      }
      else
      {
        _pRM->DrawSphere(0.01f,colYELLOW,5);
      }
      _pRM->DrawLine(v3fZERO,g_vCollisions[i].m_Normal*0.5f,colGREEN);
  }


}
Beispiel #12
0
SrtTransform::SrtTransform(const Mat44f& m)
	:
	translation(m.translation())
{
	scale.x = Vec3f(m.m00, m.m10, m.m20).length();
	scale.y = Vec3f(m.m01, m.m11, m.m21).length();
	scale.z = Vec3f(m.m02, m.m12, m.m22).length();

	// Undo the effect of scaling on the 3x3 matrix
//	rotation = m.mat33();
//	for(size_t i=0; i<3; ++i) for(size_t j=0; j<3; ++j)
//		rotation[i][j] /= scale[j];
}
Beispiel #13
0
void CWayPointManager::DebugRender()
{
	CORE->GetRenderManager()->SetTransform(m44fIDENTITY);

	WayPointGroupMapIt itMap = m_WPGroups.begin();
	WayPointGroupMapIt itMapEnd = m_WPGroups.end();

	for (; itMap != itMapEnd; ++itMap)
	{
		WayPointListIt it = itMap->second.begin();
		WayPointListIt itEnd = itMap->second.end();

		for (; it != itEnd; ++it)
		{
			CWayPoint *wp = (*it);

			Mat44f trans = m44fIDENTITY;
			trans.Translate((*it)->GetPosition());
			CORE->GetRenderManager()->SetTransform(trans);

			CORE->GetRenderManager()->DrawCube(Vect3f(2.0f, 2.0f, 2.0f), colRED);

			WayPointList& bros = wp->GetBrothers();

			WayPointListIt broIt = bros.begin();
			WayPointListIt broItEnd = bros.end();

			trans = m44fIDENTITY;
			CORE->GetRenderManager()->SetTransform(trans);

			for (; broIt != broItEnd; ++broIt)
			{
				CORE->GetRenderManager()->DrawLine(wp->GetPosition(), (*broIt)->GetPosition(), colRED);
			}
		}
	}
}
Beispiel #14
0
void Feature_FBO_MRT::createSecondPass()
{
  // Geometry

  GeometryDataSharedPtr geoDataScreenQuad = createQuad( AttributeID::POSITION | AttributeID::TEXCOORD0, math::Vec3f(-m_aspectRatio, -1.0f, 0.0f), math::Vec3f(m_aspectRatio, -1.0f, 0.0f), math::Vec3f(-m_aspectRatio, 1.0f, 0.0f) );
  GeometrySharedHandle geoScreenQuad = rix::util::generateGeometry(geoDataScreenQuad, m_rix);

  // Shader Code

  const char * vertexShader = ""
    "#version 400\n"
    "layout(location=0) in vec3 Position;\n"
    "layout(location=8) in vec2 TexCoord;\n\n"

    "uniform mat4 world2clip;\n\n"

    "out vec2 vTexCoord;\n"

    "void main(void)\n"
    "{\n"
    "  vTexCoord     = TexCoord;\n"
    "  gl_Position   = world2clip * vec4( Position, 1.0 );\n"
    "}\n";

  ProgramShaderCode vertShader( vertexShader, ShaderType::VERTEX_SHADER );


  const char * fragmentShader = ""
    "#version 400\n"
    "uniform sampler2D FBOTex0;\n"
    "uniform sampler2D FBOTex1;\n"
    "uniform float myWeights[7] = float[](4.0f, 6.0f, 3.5f, 2.0f, 1.5f, 1.0f, 0.0f);\n"
    "uniform float divideBySum = 1.0f/18.0f;\n\n"

    "in vec2 vTexCoord;\n"
    "layout(location = 0, index = 0) out vec4 Color;\n\n"

    "void main(void)\n"
    "{\n"
    "  vec3 curSample = texture(FBOTex0, vTexCoord).xyz;\n"
    "  float objSample = textureLod(FBOTex1, vTexCoord, 0.0f).x;\n"
    "  float glowAccum = 0.0f;\n"
    "  if( objSample > 0.0f )\n"
    "  {\n"
    "    Color = vec4( curSample, 1.0f );\n"
    "    return;\n"
    "  }\n"
    "  \n"
    "  for(int i = 1; i < 8; ++i)\n"
    "  {\n"
    "    glowAccum += myWeights[i - 1]*textureLod(FBOTex1, vTexCoord, float(i)).x;\n"
    "  }\n"
    "  glowAccum *= divideBySum;\n"
    "  Color = vec4( glowAccum, glowAccum, glowAccum, 1.0f ) + vec4( curSample, 0.0f );\n"
    "}\n";

  ProgramShaderCode fragShader( fragmentShader, ShaderType::FRAGMENT_SHADER );

  // Program Parameters

  ProgramParameter vertexProgramParameters[] = {
    ProgramParameter("world2clip", ContainerParameterType::MAT4X4)
  };

  ProgramParameter fragmentProgramParameters[] = {
    ProgramParameter("FBOTex0", ContainerParameterType::SAMPLER),
    ProgramParameter("FBOTex1", ContainerParameterType::SAMPLER)
  };

  // Container Descriptors

  ////Descriptors
  //DP_ASSERT(m_vertConstContainerDescriptor);

  ContainerDescriptorSharedHandle vertContainerDescriptor =
    m_rix->containerDescriptorCreate( ProgramParameterDescriptorCommon( vertexProgramParameters,
    sizeof testfw::core::array(vertexProgramParameters) ) );

  ContainerDescriptorSharedHandle fragContainerDescriptor =
    m_rix->containerDescriptorCreate( ProgramParameterDescriptorCommon( fragmentProgramParameters,
    sizeof testfw::core::array(fragmentProgramParameters) ) );

  ////Per Shader Stage Arrays
  ContainerDescriptorSharedHandle vertContainerDescriptors[] = { vertContainerDescriptor };
  ContainerDescriptorSharedHandle fragContainerDescriptors[] = { fragContainerDescriptor };

  // Container Entries

  //// Global
  m_containerEntryFBOTexture0 = m_rix->containerDescriptorGetEntry( fragContainerDescriptor, "FBOTex0" );
  m_containerEntryFBOTexture1 = m_rix->containerDescriptorGetEntry( fragContainerDescriptor, "FBOTex1" );

  //// Local
  ContainerEntry containerEntryScreenProj = m_rix->containerDescriptorGetEntry( vertContainerDescriptor, "world2clip" );

  // Program Descriptors

  ProgramDescription vertProgramDescription( vertShader, vertContainerDescriptors, sizeof testfw::core::array(vertContainerDescriptors) );
  ProgramDescription fragmentProgramDescription( fragShader, fragContainerDescriptors, sizeof testfw::core::array(fragContainerDescriptors) );

  // Programs

  ProgramSharedHandle vertProgram = m_rix->programCreate( vertProgramDescription );
  ProgramSharedHandle fragProgram = m_rix->programCreate( fragmentProgramDescription );

  // Program Pipeline

  ProgramSharedHandle programs[] = {vertProgram, fragProgram};
  ProgramPipelineSharedHandle programPipeline = m_rix->programPipelineCreate( programs, sizeof testfw::core::array(programs) );

  // Containers

  //// Global
  m_fragContainerScreenPass = m_rix->containerCreate( fragContainerDescriptor );

  //// Local
  ContainerSharedHandle vertContainerScreenPass  = m_rix->containerCreate( vertContainerDescriptor );

  // Data

  //// Global
  m_fbo = static_cast<test::framework::RiXBackend*>(&(*m_backend))->createAuxiliaryRenderTarget(m_width, m_height);

  //// Local

  //Make a native GL texture for our FBO attachment
  TextureSharedHandle textureFBO0;
  TextureSharedHandle textureFBO1;
  {
    TextureDescription textureDescription0( TextureType::_2D, InternalTextureFormat::RGBA32F, dp::PixelFormat::RGBA, dp::DataType::FLOAT_32, m_width, m_height );
    TextureDescription textureDescription1( TextureType::_2D, InternalTextureFormat::R32F, dp::PixelFormat::R, dp::DataType::FLOAT_32, m_width, m_height, 0, 0, true );
    textureFBO0 = m_rix->textureCreate( textureDescription0 );
    textureFBO1 = m_rix->textureCreate( textureDescription1 );


    m_colorBuf = gl::Texture2D::create( GL_RGBA32F, GL_RGBA, GL_UNSIGNED_BYTE, m_width, m_height );
    m_depthBuf = gl::Texture2D::create( GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, m_width, m_height );

    m_colorGlowBuf = gl::Texture2D::create( GL_R32F, GL_RGBA, GL_UNSIGNED_BYTE, 2*m_width, 2*m_height );

    m_fbo.inplaceCast<dp::gl::RenderTargetFBO>()->setAttachment( gl::RenderTargetFBO::AttachmentTarget::COLOR0, m_colorBuf );
    m_fbo.inplaceCast<dp::gl::RenderTargetFBO>()->setAttachment( gl::RenderTargetFBO::AttachmentTarget::COLOR1, m_colorGlowBuf );
    m_fbo.inplaceCast<dp::gl::RenderTargetFBO>()->setAttachment( gl::RenderTargetFBO::AttachmentTarget::DEPTH, m_depthBuf );

    rix::gl::TextureDataGLTexture textureDataGLTexture0( m_colorBuf );
    m_rix->textureSetData( textureFBO0, textureDataGLTexture0 );

    rix::gl::TextureDataGLTexture textureDataGLTexture1( m_colorGlowBuf );
    m_rix->textureSetData( textureFBO1, textureDataGLTexture1 );
  }

  Trafo model2worldScreen;
  model2worldScreen.setTranslation( Vec3f(0.0f, 0.0f, 0.0f) );
  Mat44f model2worldScreenIT = ~model2worldScreen.getInverse();

  Mat44f world2ViewI = m_world2View;
  world2ViewI.invert();

  Mat44f viewOrtho = makeOrtho( -m_aspectRatio, m_aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f);
  Mat44f modelOrtho = cIdentity44f;
  Mat44f modelClip = model2worldScreen.getMatrix() * viewOrtho;

  // Set Container Data

  SamplerStateSharedHandle samplerStateHandle0 = m_rix->samplerStateCreate( SamplerStateDataCommon( SamplerStateFilterMode::NEAREST, SamplerStateFilterMode::NEAREST ) );
  SamplerStateSharedHandle samplerStateHandle1 = m_rix->samplerStateCreate( SamplerStateDataCommon( SamplerStateFilterMode::LINEAR_MIPMAP_NEAREST, SamplerStateFilterMode::NEAREST ) );

  rix::core::SamplerSharedHandle samplerFBO0 = m_rix->samplerCreate();
  m_rix->samplerSetTexture( samplerFBO0, textureFBO0 );
  m_rix->samplerSetSamplerState( samplerFBO0, samplerStateHandle0 );

  rix::core::SamplerSharedHandle samplerFBO1 = m_rix->samplerCreate();
  m_rix->samplerSetTexture( samplerFBO1, textureFBO1 );
  m_rix->samplerSetSamplerState( samplerFBO1, samplerStateHandle1 );

  m_rix->containerSetData( vertContainerScreenPass, containerEntryScreenProj, ContainerDataRaw( 0, modelClip.getPtr(),  16*sizeof(float) ) );
  m_rix->containerSetData( m_fragContainerScreenPass, m_containerEntryFBOTexture0, ContainerDataSampler( samplerFBO0 ) );
  m_rix->containerSetData( m_fragContainerScreenPass, m_containerEntryFBOTexture1, ContainerDataSampler( samplerFBO1 ) );

  // Geometry Instances

  GeometryInstanceSharedHandle geometryInstanceScreen = m_rix->geometryInstanceCreate();
  m_rix->geometryInstanceSetGeometry( geometryInstanceScreen, geoScreenQuad );
  m_rix->geometryInstanceSetProgramPipeline( geometryInstanceScreen, programPipeline );
  m_rix->geometryInstanceUseContainer( geometryInstanceScreen, vertContainerScreenPass );
  m_rix->geometryInstanceUseContainer( geometryInstanceScreen, m_fragContainerScreenPass );

  // Render Group

  m_renderGroupSecondPass = m_rix->renderGroupCreate();
  m_renderData->setRenderGroup(m_renderGroupSecondPass);
  m_rix->renderGroupAddGeometryInstance( m_renderGroupSecondPass, geometryInstanceScreen );
}
void FpsControllerComponent::update(float dt)
{
	if(!inputComponent || !target)
		return;

	// Make a short-cut first
	Mat44f localTransform = target->localTransform;

	{	// Handling rotation
		Vec2f currentMouseAxis = Vec2f(inputComponent->getAxis("mouse x"), inputComponent->getAxis("mouse y"));

		if(inputComponent->getMouseButton(0))
		{
			Vec2f delta = currentMouseAxis - mLastMouseAxis;
			delta *= -mouseSensitivity;
			mAccumulateMouseDelta += delta;

			Mat44f horizontalRotation = Mat44f::makeAxisRotation(Vec3f(0, 1, 0), mAccumulateMouseDelta.x);
			Mat44f verticalRotation = Mat44f::makeAxisRotation(horizontalRotation.xBiasVector(), mAccumulateMouseDelta.y);

			Vec3f backupTranslation = localTransform.translation();
			localTransform = verticalRotation * horizontalRotation;
			localTransform.translateBy(backupTranslation);
		}
		mLastMouseAxis = currentMouseAxis;
	}

	{	// Handling translation
		Vec3f translation = Vec3f::cZero;

		if(inputComponent->getButton("s"))
			  translation += localTransform.zBiasVector();
		if(inputComponent->getButton("w"))
			  translation -= localTransform.zBiasVector();
		if(inputComponent->getButton("d"))
			  translation += localTransform.xBiasVector();
		if(inputComponent->getButton("a"))
			  translation -= localTransform.xBiasVector();
		if(inputComponent->getButton("PageUp"))
			  translation += localTransform.yBiasVector();
		if(inputComponent->getButton("PageDown"))
			  translation -= localTransform.yBiasVector();

		translation *= dt * translationSpeed;
		localTransform.translateBy(translation);
	}

/*	{	// Handle mouse wheel
		float z = inputComponent->getAxisDelta("mouse z");
		float newFov = fov * (1 - z / 20);
		if(newFov < 140)
			fov = newFov;
	}*/

	target->localTransform = localTransform;
}
Beispiel #16
0
	Mat44f Trafo::getInverse () const { Mat44f ivMat = m_matrix; ivMat.invert (); return ivMat;}