Implement normal perturbation materials on raytracing
This commit is contained in:
parent
89bb47ede6
commit
ee71875b4b
|
@ -54,6 +54,10 @@
|
|||
|
||||
void C3D_RENDER_RAYTRACING::setupMaterials()
|
||||
{
|
||||
m_board_normal_perturbator = CBOARDNORMAL( 1.25f * IU_PER_MM * m_settings.BiuTo3Dunits() );
|
||||
m_copper_normal_perturbator = CCOPPERNORMAL( &m_board_normal_perturbator );
|
||||
m_solder_mask_normal_perturbator = CSOLDERMASKNORMAL( &m_copper_normal_perturbator );
|
||||
|
||||
// http://devernay.free.fr/cours/opengl/materials.html
|
||||
|
||||
// Copper
|
||||
|
@ -76,6 +80,8 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
|
|||
0.0f, // transparency
|
||||
0.0f );
|
||||
|
||||
m_materials.m_Copper.SetNormalPerturbator( &m_copper_normal_perturbator );
|
||||
|
||||
m_materials.m_Paste = CBLINN_PHONG_MATERIAL(
|
||||
(SFVEC3F)m_settings.m_SolderPasteColor *
|
||||
(SFVEC3F)m_settings.m_SolderPasteColor, // ambient
|
||||
|
@ -111,6 +117,8 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
|
|||
|
||||
m_materials.m_SolderMask.SetCastShadows( true );
|
||||
|
||||
m_materials.m_SolderMask.SetNormalPerturbator( &m_solder_mask_normal_perturbator );
|
||||
|
||||
m_materials.m_EpoxyBoard = CBLINN_PHONG_MATERIAL(
|
||||
SFVEC3F( 16.0f / 255.0f,
|
||||
14.0f / 255.0f,
|
||||
|
@ -123,6 +131,8 @@ void C3D_RENDER_RAYTRACING::setupMaterials()
|
|||
0.10f, // transparency
|
||||
0.0f ); // reflection
|
||||
|
||||
m_materials.m_EpoxyBoard.SetNormalPerturbator( &m_board_normal_perturbator );
|
||||
|
||||
SFVEC3F bgTop = (SFVEC3F)m_settings.m_BgColorTop;
|
||||
//SFVEC3F bgBot = (SFVEC3F)m_settings.m_BgColorBot;
|
||||
|
||||
|
|
|
@ -1346,7 +1346,7 @@ void C3D_RENDER_RAYTRACING::rt_render_post_process_blur_finish( GLubyte *ptrPBO,
|
|||
#pragma omp barrier
|
||||
|
||||
// Debug code
|
||||
m_postshader_ssao.DebugBuffersOutputAsImages();
|
||||
//m_postshader_ssao.DebugBuffersOutputAsImages();
|
||||
}
|
||||
|
||||
// End rendering
|
||||
|
|
|
@ -96,6 +96,10 @@ private:
|
|||
CBLINN_PHONG_MATERIAL m_Floor;
|
||||
}m_materials;
|
||||
|
||||
CBOARDNORMAL m_board_normal_perturbator;
|
||||
CCOPPERNORMAL m_copper_normal_perturbator;
|
||||
CSOLDERMASKNORMAL m_solder_mask_normal_perturbator;
|
||||
|
||||
bool m_isPreview;
|
||||
|
||||
SFVEC3F shadeHit( const SFVEC3F &aBgColor,
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
*/
|
||||
|
||||
#include "cmaterial.h"
|
||||
#include <3d_math.h>
|
||||
#include <wx/debug.h>
|
||||
|
||||
|
||||
|
@ -40,6 +41,8 @@ CMATERIAL::CMATERIAL()
|
|||
m_transparency = 0.0f; // completely opaque
|
||||
m_cast_shadows = true;
|
||||
m_reflection = 0.0f;
|
||||
|
||||
m_normal_perturbator = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,6 +69,8 @@ CMATERIAL::CMATERIAL( const SFVEC3F &aAmbient,
|
|||
m_transparency = aTransparency;
|
||||
m_reflection = aReflection;
|
||||
m_cast_shadows = true;
|
||||
|
||||
m_normal_perturbator = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -117,3 +122,62 @@ SFVEC3F CBLINN_PHONG_MATERIAL::Shade( const RAY &aRay,
|
|||
|
||||
return m_ambientColor * ambientFactor;
|
||||
}
|
||||
|
||||
|
||||
CPROCEDURALGENERATOR::CPROCEDURALGENERATOR()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CBOARDNORMAL::CBOARDNORMAL( float aScale ) : CPROCEDURALGENERATOR()
|
||||
{
|
||||
m_scale = (2.0f * glm::pi<float>()) / aScale;
|
||||
}
|
||||
|
||||
|
||||
SFVEC3F CBOARDNORMAL::Generate( const RAY &aRay, const HITINFO &aHitInfo ) const
|
||||
{
|
||||
const SFVEC3F hitPos = aRay.at( aHitInfo.m_tHit );
|
||||
|
||||
// http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiJzaW4oc2luKHgpKjEuNykrMSIsImNvbG9yIjoiIzAwMDAwMCJ9LHsidHlwZSI6MTAwMCwid2luZG93IjpbIi0wLjk2MjEwNTcwODA3ODUyNjIiLCI3Ljk3MTQyNjI2NzYwMTQzIiwiLTIuNTE3NjIwMzUxNDgyNDQ5IiwiMi45Nzk5Mzc3ODczOTc1MzAzIl0sInNpemUiOls2NDgsMzk4XX1d
|
||||
|
||||
return SFVEC3F( ((float)glm::sin( glm::sin(hitPos.x * m_scale ) ) + 1.0f) * 0.15f,
|
||||
((float)glm::sin( glm::sin(hitPos.y * m_scale ) ) + 1.0f) * 0.07f,
|
||||
0.0f );
|
||||
}
|
||||
|
||||
|
||||
CCOPPERNORMAL::CCOPPERNORMAL( const CBOARDNORMAL *aBoardNormalGenerator )
|
||||
{
|
||||
m_board_normal_generator = aBoardNormalGenerator;
|
||||
}
|
||||
|
||||
|
||||
SFVEC3F CCOPPERNORMAL::Generate( const RAY &aRay, const HITINFO &aHitInfo ) const
|
||||
{
|
||||
if( m_board_normal_generator )
|
||||
{
|
||||
const SFVEC3F boardNormal = m_board_normal_generator->Generate( aRay, aHitInfo );
|
||||
|
||||
return boardNormal * SFVEC3F(0.75f);
|
||||
}
|
||||
else
|
||||
return SFVEC3F(0.0f);
|
||||
}
|
||||
|
||||
CSOLDERMASKNORMAL::CSOLDERMASKNORMAL( const CCOPPERNORMAL *aCopperNormalGenerator )
|
||||
{
|
||||
m_copper_normal_generator = aCopperNormalGenerator;
|
||||
}
|
||||
|
||||
SFVEC3F CSOLDERMASKNORMAL::Generate( const RAY &aRay, const HITINFO &aHitInfo ) const
|
||||
{
|
||||
if( m_copper_normal_generator )
|
||||
{
|
||||
const SFVEC3F copperNormal = m_copper_normal_generator->Generate( aRay, aHitInfo );
|
||||
|
||||
return copperNormal * SFVEC3F(0.40f);
|
||||
}
|
||||
else
|
||||
return SFVEC3F(0.0f);
|
||||
}
|
||||
|
|
|
@ -33,6 +33,68 @@
|
|||
#include "ray.h"
|
||||
#include "hitinfo.h"
|
||||
|
||||
/// A base class that can be used to derive a procedural generator implementation
|
||||
class CPROCEDURALGENERATOR
|
||||
{
|
||||
public:
|
||||
CPROCEDURALGENERATOR();
|
||||
|
||||
/**
|
||||
* @brief Generate - Generates a 3D vector based on the ray and
|
||||
* hit information depending on the implementation
|
||||
* @param aRay: the camera ray that hits the object
|
||||
* @param aHitInfo: the hit information
|
||||
* @return the result of the procedural
|
||||
*/
|
||||
virtual SFVEC3F Generate( const RAY &aRay,
|
||||
const HITINFO &aHitInfo ) const = 0;
|
||||
|
||||
protected:
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Procedural generation of the board normals
|
||||
class CBOARDNORMAL : public CPROCEDURALGENERATOR
|
||||
{
|
||||
public:
|
||||
CBOARDNORMAL() : CPROCEDURALGENERATOR() { m_scale = 1.0f; }
|
||||
CBOARDNORMAL( float aScale );
|
||||
|
||||
// Imported from CPROCEDURALGENERATOR
|
||||
SFVEC3F Generate( const RAY &aRay,
|
||||
const HITINFO &aHitInfo ) const override;
|
||||
private:
|
||||
float m_scale;
|
||||
};
|
||||
|
||||
// Procedural generation of the copper normals
|
||||
class CCOPPERNORMAL : public CPROCEDURALGENERATOR
|
||||
{
|
||||
public:
|
||||
CCOPPERNORMAL() : CPROCEDURALGENERATOR() { m_board_normal_generator = NULL; }
|
||||
CCOPPERNORMAL( const CBOARDNORMAL *aBoardNormalGenerator );
|
||||
|
||||
// Imported from CPROCEDURALGENERATOR
|
||||
SFVEC3F Generate( const RAY &aRay,
|
||||
const HITINFO &aHitInfo ) const override;
|
||||
private:
|
||||
const CBOARDNORMAL *m_board_normal_generator;
|
||||
};
|
||||
|
||||
// Procedural generation of the solder mask
|
||||
class CSOLDERMASKNORMAL : public CPROCEDURALGENERATOR
|
||||
{
|
||||
public:
|
||||
CSOLDERMASKNORMAL() : CPROCEDURALGENERATOR() { m_copper_normal_generator = NULL; }
|
||||
CSOLDERMASKNORMAL( const CCOPPERNORMAL *aCopperNormalGenerator );
|
||||
|
||||
// Imported from CPROCEDURALGENERATOR
|
||||
SFVEC3F Generate( const RAY &aRay,
|
||||
const HITINFO &aHitInfo ) const override;
|
||||
private:
|
||||
const CCOPPERNORMAL *m_copper_normal_generator;
|
||||
};
|
||||
|
||||
/// A base material class that can be used to derive a material implementation
|
||||
class CMATERIAL
|
||||
|
@ -81,6 +143,9 @@ public:
|
|||
const SFVEC3F &aLightColor,
|
||||
float aShadowAttenuationFactor ) const = 0;
|
||||
|
||||
void SetNormalPerturbator( const CPROCEDURALGENERATOR *aPerturbator ) { m_normal_perturbator = aPerturbator; }
|
||||
const CPROCEDURALGENERATOR *GetNormalPerturbator() const { return m_normal_perturbator; }
|
||||
|
||||
protected:
|
||||
SFVEC3F m_ambientColor;
|
||||
|
||||
|
@ -94,6 +159,8 @@ protected:
|
|||
float m_transparency; ///< 1.0 is completely transparent, 0.0 completely opaque
|
||||
float m_reflection; ///< 1.0 completely reflective, 0.0 no reflective
|
||||
bool m_cast_shadows; ///< true if this object will block the light
|
||||
|
||||
const CPROCEDURALGENERATOR *m_normal_perturbator;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -114,6 +114,14 @@ bool CVCYLINDER::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( -(hitPoint2D.x - m_center.x) * m_inv_radius,
|
||||
-(hitPoint2D.y - m_center.y) * m_inv_radius,
|
||||
0.0f );
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
aHitInfo.pHitObject = this;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,6 +53,14 @@ bool CDUMMYBLOCK::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, 1.0f );
|
||||
else
|
||||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f,-1.0f );
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -66,7 +66,7 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
if( fabs(tBBoxStart - tBBoxEnd) < FLT_EPSILON )
|
||||
return false;
|
||||
|
||||
bool startedInside = m_bbox.Inside( aRay.m_Origin );
|
||||
const bool startedInside = m_bbox.Inside( aRay.m_Origin );
|
||||
|
||||
if( !startedInside )
|
||||
{
|
||||
|
@ -122,6 +122,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, -1.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -139,6 +146,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, 1.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -161,6 +175,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, 1.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -183,6 +204,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, -1.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -228,6 +256,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( outNormal.x, outNormal.y, 0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -259,13 +294,19 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
if( tBBoxEnd < aHitInfo.m_tHit )
|
||||
{
|
||||
aHitInfo.m_tHit = tBBoxEnd;
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if( aRay.m_Dir.z > 0.0f )
|
||||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, -1.0f );
|
||||
else
|
||||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f, 1.0f );
|
||||
|
||||
aHitInfo.pHitObject = this;
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -279,6 +320,7 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
// and calculate the real hitT of the ray.
|
||||
const SFVEC3F hitPoint = boxHitPointStart +
|
||||
(boxHitPointEnd - boxHitPointStart) * tOut;
|
||||
|
||||
const float t = glm::length( hitPoint - aRay.m_Origin );
|
||||
|
||||
if( t < aHitInfo.m_tHit )
|
||||
|
@ -288,6 +330,13 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aHitInfo.m_HitNormal = SFVEC3F( outNormal.x, outNormal.y, 0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ enum OBJECT3D_TYPE
|
|||
OBJ3D_MAX
|
||||
};
|
||||
|
||||
|
||||
class COBJECT
|
||||
{
|
||||
protected:
|
||||
|
|
|
@ -90,6 +90,13 @@ bool CXYPLANE::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
else
|
||||
aHitInfo.m_HitNormal = SFVEC3F( 0.0f, 0.0f,-1.0f );
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,13 @@ bool CROUNDSEG::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
aRay.m_dirIsNeg[2]? 1.0f: -1.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -125,6 +132,13 @@ bool CROUNDSEG::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -162,6 +176,13 @@ bool CROUNDSEG::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -212,6 +233,13 @@ bool CROUNDSEG::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -252,6 +280,13 @@ bool CROUNDSEG::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
0.0f );
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -259,6 +259,13 @@ bool CTRIANGLE::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
|
|||
u * m_normal[1] +
|
||||
v * m_normal[2] );
|
||||
|
||||
if (m_material->GetNormalPerturbator())
|
||||
{
|
||||
aHitInfo.m_HitNormal = aHitInfo.m_HitNormal +
|
||||
m_material->GetNormalPerturbator()->Generate( aRay, aHitInfo );
|
||||
aHitInfo.m_HitNormal = glm::normalize( aHitInfo.m_HitNormal );
|
||||
}
|
||||
|
||||
aHitInfo.pHitObject = this;
|
||||
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue