Commit b7d528d4 authored by hybrid's avatar hybrid

Q3 shader fix by sio2

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1550 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 47b358bc
...@@ -42,12 +42,12 @@ CQuake3ShaderSceneNode::CQuake3ShaderSceneNode( ...@@ -42,12 +42,12 @@ CQuake3ShaderSceneNode::CQuake3ShaderSceneNode(
this->Name = Shader->name; this->Name = Shader->name;
// clone meshbuffer to modifiable buffer // clone meshbuffer to modifiable buffer
cloneBuffer( static_cast< scene::SMeshBufferLightMap *> ( buffer ) ); cloneBuffer( static_cast< scene::SMeshBufferLightMap *>( buffer ) );
// load all Textures in all stages // load all Textures in all stages
loadTextures ( fileSystem ); loadTextures( fileSystem );
setAutomaticCulling ( scene::EAC_BOX ); setAutomaticCulling( scene::EAC_BOX );
} }
...@@ -63,7 +63,7 @@ CQuake3ShaderSceneNode::~CQuake3ShaderSceneNode() ...@@ -63,7 +63,7 @@ CQuake3ShaderSceneNode::~CQuake3ShaderSceneNode()
/* /*
create single copies create single copies
*/ */
void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer ) void CQuake3ShaderSceneNode::cloneBuffer( scene::SMeshBufferLightMap * buffer )
{ {
Original->Material = buffer->Material; Original->Material = buffer->Material;
MeshBuffer->Material = buffer->Material; MeshBuffer->Material = buffer->Material;
...@@ -71,7 +71,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer ) ...@@ -71,7 +71,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
Original->Indices = buffer->Indices; Original->Indices = buffer->Indices;
MeshBuffer->Indices = buffer->Indices; MeshBuffer->Indices = buffer->Indices;
const u32 vsize = buffer->Vertices.size (); const u32 vsize = buffer->Vertices.size();
Original->Vertices.reallocate( vsize ); Original->Vertices.reallocate( vsize );
MeshBuffer->Vertices.reallocate( vsize ); MeshBuffer->Vertices.reallocate( vsize );
...@@ -87,7 +87,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer ) ...@@ -87,7 +87,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
MeshBuffer->Vertices.getLast().Color=0xFFFFFFFF; MeshBuffer->Vertices.getLast().Color=0xFFFFFFFF;
} }
MeshBuffer->recalculateBoundingBox (); MeshBuffer->recalculateBoundingBox();
#if 1 #if 1
// move the (temp) Mesh // move the (temp) Mesh
...@@ -103,7 +103,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer ) ...@@ -103,7 +103,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
SceneManager->getMeshManipulator()->transform( Original, m ); SceneManager->getMeshManipulator()->transform( Original, m );
SceneManager->getMeshManipulator()->transform( MeshBuffer, m ); SceneManager->getMeshManipulator()->transform( MeshBuffer, m );
MeshBuffer->recalculateBoundingBox (); MeshBuffer->recalculateBoundingBox();
} }
#endif #endif
// used for sorting // used for sorting
...@@ -111,31 +111,30 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer ) ...@@ -111,31 +111,30 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
} }
/* /*
load the textures for all stages load the textures for all stages
*/ */
void CQuake3ShaderSceneNode::loadTextures ( io::IFileSystem * fileSystem ) void CQuake3ShaderSceneNode::loadTextures( io::IFileSystem * fileSystem )
{ {
const quake3::SVarGroup *group; const quake3::SVarGroup *group;
u32 i; u32 i;
// clear all stages and prefill empty // clear all stages and prefill empty
Q3Texture.clear (); Q3Texture.clear();
for ( i = 0; i != Shader->VarGroup->VariableGroup.size (); ++i ) for ( i = 0; i != Shader->VarGroup->VariableGroup.size(); ++i )
{ {
Q3Texture.push_back ( SQ3Texture() ); Q3Texture.push_back( SQ3Texture() );
} }
u32 pos; u32 pos;
// get texture map // get texture map
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i ) for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
{ {
group = Shader->getGroup ( i ); group = Shader->getGroup( i );
const core::stringc &mapname = group->get ( "map" ); const core::stringc &mapname = group->get( "map" );
if ( 0 == mapname.size () ) if ( 0 == mapname.size() )
continue; continue;
// our lightmap is passed in material.Texture[2] // our lightmap is passed in material.Texture[2]
...@@ -146,44 +145,44 @@ void CQuake3ShaderSceneNode::loadTextures ( io::IFileSystem * fileSystem ) ...@@ -146,44 +145,44 @@ void CQuake3ShaderSceneNode::loadTextures ( io::IFileSystem * fileSystem )
else else
{ {
pos = 0; pos = 0;
quake3::getTextures ( Q3Texture [i].Texture, mapname, pos, fileSystem, SceneManager->getVideoDriver() ); quake3::getTextures( Q3Texture [i].Texture, mapname, pos, fileSystem, SceneManager->getVideoDriver() );
} }
} }
// get anim map // get anim map
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i ) for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
{ {
if ( Q3Texture [i].Texture.size() ) if ( Q3Texture [i].Texture.size() )
continue; continue;
group = Shader->getGroup ( i ); group = Shader->getGroup( i );
const core::stringc &animmap = group->get ( "animmap" ); const core::stringc &animmap = group->get( "animmap" );
if ( 0 == animmap.size () ) if ( 0 == animmap.size() )
continue; continue;
// first parameter is frequency // first parameter is frequency
pos = 0; pos = 0;
Q3Texture [i].TextureFrequency = core::max_ ( 0.0001f, quake3::getAsFloat ( animmap, pos ) ); Q3Texture [i].TextureFrequency = core::max_( 0.0001f, quake3::getAsFloat( animmap, pos ) );
quake3::getTextures ( Q3Texture [i].Texture, animmap, pos,fileSystem, SceneManager->getVideoDriver() ); quake3::getTextures( Q3Texture [i].Texture, animmap, pos,fileSystem, SceneManager->getVideoDriver() );
} }
// get clamp map // get clamp map
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i ) for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
{ {
if ( Q3Texture [i].Texture.size() ) if ( Q3Texture [i].Texture.size() )
continue; continue;
group = Shader->getGroup ( i ); group = Shader->getGroup( i );
const core::stringc &clampmap = group->get ( "clampmap" ); const core::stringc &clampmap = group->get( "clampmap" );
if ( 0 == clampmap.size () ) if ( 0 == clampmap.size() )
continue; continue;
Q3Texture [i].TextureAddressMode = video::ETC_CLAMP; Q3Texture [i].TextureAddressMode = video::ETC_CLAMP;
pos = 0; pos = 0;
quake3::getTextures ( Q3Texture [i].Texture, clampmap, pos,fileSystem, SceneManager->getVideoDriver() ); quake3::getTextures( Q3Texture [i].Texture, clampmap, pos,fileSystem, SceneManager->getVideoDriver() );
} }
} }
...@@ -194,43 +193,43 @@ void CQuake3ShaderSceneNode::OnRegisterSceneNode() ...@@ -194,43 +193,43 @@ void CQuake3ShaderSceneNode::OnRegisterSceneNode()
{ {
if ( isVisible() ) if ( isVisible() )
{ {
SceneManager->registerNodeForRendering(this, isTransparent () ? ESNRP_TRANSPARENT: ESNRP_SOLID ); SceneManager->registerNodeForRendering(this, isTransparent() ? ESNRP_TRANSPARENT: ESNRP_SOLID );
} }
ISceneNode::OnRegisterSceneNode (); ISceneNode::OnRegisterSceneNode();
} }
/* /*
is this a transparent node ? is this a transparent node ?
*/ */
bool CQuake3ShaderSceneNode::isTransparent () const bool CQuake3ShaderSceneNode::isTransparent() const
{ {
bool ret = false; bool ret = false;
// generic stage // generic stage
const quake3::SVarGroup *group; const quake3::SVarGroup *group;
group = Shader->getGroup ( 1 ); group = Shader->getGroup( 1 );
/* /*
if ( group->isDefined ( "surfaceparm", "nonsolid" ) ) if ( group->isDefined( "surfaceparm", "nonsolid" ) )
{ {
ret = true; ret = true;
} }
*/ */
if ( group->isDefined ( "surfaceparm", "trans" ) ) if ( group->isDefined( "surfaceparm", "trans" ) )
{ {
ret = true; ret = true;
} }
else else
{ {
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size (); ++stage ) for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size(); ++stage )
{ {
if ( 0 == Q3Texture [ stage].Texture.size() ) if ( 0 == Q3Texture [ stage].Texture.size() )
continue; continue;
group = Shader->getGroup ( stage ); group = Shader->getGroup( stage );
quake3::SBlendFunc blendfunc; quake3::SBlendFunc blendfunc;
quake3::getBlendFunc ( group->get ( "blendfunc" ), blendfunc ); quake3::getBlendFunc( group->get( "blendfunc" ), blendfunc );
quake3::getBlendFunc ( group->get ( "alphafunc" ), blendfunc ); quake3::getBlendFunc( group->get( "alphafunc" ), blendfunc );
ret = blendfunc.isTransparent; ret = blendfunc.isTransparent;
break; break;
...@@ -260,34 +259,34 @@ void CQuake3ShaderSceneNode::render() ...@@ -260,34 +259,34 @@ void CQuake3ShaderSceneNode::render()
material.NormalizeNormals = false; material.NormalizeNormals = false;
// generic stage // generic stage
group = Shader->getGroup ( 1 ); group = Shader->getGroup( 1 );
material.BackfaceCulling = quake3::isDisabled ( group->get ( "cull" ) ); material.BackfaceCulling = quake3::isDisabled( group->get( "cull" ) );
// u32 zEnable = group->getIndex ( "polygonoffset" ) >= 0; // u32 zEnable = group->getIndex( "polygonoffset" ) >= 0;
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation ); driver->setTransform(video::ETS_WORLD, AbsoluteTransformation );
u32 drawCount = 0; u32 drawCount = 0;
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size (); ++stage ) for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size(); ++stage )
//for ( u32 stage = 2; stage < 3; ++stage ) //for ( u32 stage = 2; stage < 3; ++stage )
{ {
SQ3Texture &q = Q3Texture [ stage]; SQ3Texture &q = Q3Texture [ stage];
// advance current stage // advance current stage
core::matrix4 texture; core::matrix4 texture;
animate ( stage, texture ); animate( stage, texture );
// stage 1 finished, no drawing stage ( vertex transform only ) // stage 1 finished, no drawing stage ( vertex transform only )
if ( 0 == q.Texture.size() ) if ( 0 == q.Texture.size() )
continue; continue;
// current stage // current stage
group = Shader->getGroup ( stage ); group = Shader->getGroup( stage );
material.setTexture(0, q.Texture [ q.TextureIndex ]); material.setTexture(0, q.Texture [ q.TextureIndex ]);
material.ZBuffer = quake3::getDepthFunction ( group->get ( "depthfunc" ) ); material.ZBuffer = quake3::getDepthFunction( group->get( "depthfunc" ) );
if ( group->getIndex ( "depthwrite" ) >= 0 ) if ( group->getIndex( "depthwrite" ) >= 0 )
{ {
material.ZWriteEnable = true; material.ZWriteEnable = true;
} }
...@@ -298,14 +297,14 @@ void CQuake3ShaderSceneNode::render() ...@@ -298,14 +297,14 @@ void CQuake3ShaderSceneNode::render()
//resolve quake3 blendfunction to irrlicht Material Type //resolve quake3 blendfunction to irrlicht Material Type
quake3::SBlendFunc blendfunc; quake3::SBlendFunc blendfunc;
quake3::getBlendFunc ( group->get ( "blendfunc" ), blendfunc ); quake3::getBlendFunc( group->get( "blendfunc" ), blendfunc );
quake3::getBlendFunc ( group->get ( "alphafunc" ), blendfunc ); quake3::getBlendFunc( group->get( "alphafunc" ), blendfunc );
material.MaterialType = blendfunc.type; material.MaterialType = blendfunc.type;
material.MaterialTypeParam = blendfunc.param; material.MaterialTypeParam = blendfunc.param;
material.TextureLayer[0].TextureWrap = q.TextureAddressMode; material.TextureLayer[0].TextureWrap = q.TextureAddressMode;
material.setTextureMatrix ( 0, texture ); material.setTextureMatrix( 0, texture );
driver->setMaterial( material ); driver->setMaterial( material );
driver->drawMeshBuffer( MeshBuffer ); driver->drawMeshBuffer( MeshBuffer );
...@@ -325,9 +324,9 @@ void CQuake3ShaderSceneNode::render() ...@@ -325,9 +324,9 @@ void CQuake3ShaderSceneNode::render()
/*! /*!
*/ */
void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFunction &function ) void CQuake3ShaderSceneNode::vertextransform_wave( f32 dt, quake3::SModifierFunction &function )
{ {
function.wave = core::reciprocal ( function.wave ); function.wave = core::reciprocal( function.wave );
const f32 phase = function.phase; const f32 phase = function.phase;
...@@ -337,10 +336,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun ...@@ -337,10 +336,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun
const video::S3DVertex2TCoords &src = Original->Vertices[i]; const video::S3DVertex2TCoords &src = Original->Vertices[i];
video::S3DVertex &dst = MeshBuffer->Vertices[i]; video::S3DVertex &dst = MeshBuffer->Vertices[i];
f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave; const f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
function.phase = phase + wavephase; function.phase = phase + wavephase;
const f32 f = function.evaluate ( dt ); const f32 f = function.evaluate( dt );
dst.Pos.X = src.Pos.X + f * src.Normal.X; dst.Pos.X = src.Pos.X + f * src.Normal.X;
dst.Pos.Y = src.Pos.Y + f * src.Normal.Y; dst.Pos.Y = src.Pos.Y + f * src.Normal.Y;
...@@ -350,10 +349,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun ...@@ -350,10 +349,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun
/*! /*!
*/ */
void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFunction &function ) void CQuake3ShaderSceneNode::vertextransform_bulge( f32 dt, quake3::SModifierFunction &function )
{ {
function.func = 0; function.func = 0;
function.wave = core::reciprocal ( function.bulgewidth ); function.wave = core::reciprocal( function.bulgewidth );
dt *= function.bulgespeed * 0.1f; dt *= function.bulgespeed * 0.1f;
const f32 phase = function.phase; const f32 phase = function.phase;
...@@ -364,10 +363,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu ...@@ -364,10 +363,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu
const video::S3DVertex2TCoords &src = Original->Vertices[i]; const video::S3DVertex2TCoords &src = Original->Vertices[i];
video::S3DVertex &dst = MeshBuffer->Vertices[i]; video::S3DVertex &dst = MeshBuffer->Vertices[i];
f32 wavephase = (Original->Vertices[i].TCoords.X ) * function.wave; const f32 wavephase = (Original->Vertices[i].TCoords.X ) * function.wave;
function.phase = phase + wavephase; function.phase = phase + wavephase;
const f32 f = function.evaluate ( dt ); const f32 f = function.evaluate( dt );
dst.Pos.X = src.Pos.X + f * src.Normal.X; dst.Pos.X = src.Pos.X + f * src.Normal.X;
dst.Pos.Y = src.Pos.Y + f * src.Normal.Y; dst.Pos.Y = src.Pos.Y + f * src.Normal.Y;
...@@ -377,10 +376,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu ...@@ -377,10 +376,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu
/*! /*!
*/ */
void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModifierFunction &function ) void CQuake3ShaderSceneNode::vertextransform_autosprite( f32 dt, quake3::SModifierFunction &function )
{ {
const core::matrix4 &m = SceneManager->getActiveCamera()->getViewFrustum()->Matrices [ video::ETS_VIEW ]; const core::matrix4 &m = SceneManager->getActiveCamera()->getViewFrustum()->Matrices [ video::ETS_VIEW ];
const core::vector3df view ( -m[2], -m[6] , -m[10] ); const core::vector3df view( -m[2], -m[6] , -m[10] );
const u32 vsize = MeshBuffer->Vertices.size(); const u32 vsize = MeshBuffer->Vertices.size();
...@@ -390,18 +389,18 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif ...@@ -390,18 +389,18 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif
for ( u32 i = 0; i < vsize; i += 4 ) for ( u32 i = 0; i < vsize; i += 4 )
{ {
// in pairs of 4 // in pairs of 4
box.reset ( Original->Vertices[i].Pos ); box.reset( Original->Vertices[i].Pos );
for ( g = 1; g != 4; ++g ) for ( g = 1; g != 4; ++g )
{ {
box.addInternalPoint ( Original->Vertices[i + g].Pos ); box.addInternalPoint( Original->Vertices[i + g].Pos );
} }
core::vector3df c = box.getCenter (); core::vector3df c = box.getCenter();
f32 sh = 0.5f * ( box.MaxEdge.Z - box.MinEdge.Z ); f32 sh = 0.5f * ( box.MaxEdge.Z - box.MinEdge.Z );
f32 sv = 0.5f * ( box.MaxEdge.Y - box.MinEdge.Y ); f32 sv = 0.5f * ( box.MaxEdge.Y - box.MinEdge.Y );
const core::vector3df h ( m[0] * sh, m[4] * sh, m[8] * sh ); const core::vector3df h( m[0] * sh, m[4] * sh, m[8] * sh );
const core::vector3df v ( m[1] * sv, m[5] * sv, m[9] * sv ); const core::vector3df v( m[1] * sv, m[5] * sv, m[9] * sv );
MeshBuffer->Vertices[ i + 0 ].Pos = c + h + v; MeshBuffer->Vertices[ i + 0 ].Pos = c + h + v;
MeshBuffer->Vertices[ i + 1 ].Pos = c - h - v; MeshBuffer->Vertices[ i + 1 ].Pos = c - h - v;
...@@ -418,7 +417,7 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif ...@@ -418,7 +417,7 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif
/* /*
Generate Vertex Color Generate Vertex Color
*/ */
void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierFunction &function ) void CQuake3ShaderSceneNode::vertextransform_rgbgen( f32 dt, quake3::SModifierFunction &function )
{ {
u32 i; u32 i;
const u32 vsize = MeshBuffer->Vertices.size(); const u32 vsize = MeshBuffer->Vertices.size();
...@@ -438,8 +437,8 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF ...@@ -438,8 +437,8 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF
case 5: case 5:
{ {
// wave // wave
f32 f = function.evaluate ( dt ) * 255.f; f32 f = function.evaluate( dt ) * 255.f;
s32 value = core::clamp ( core::floor32 ( f ), 0, 255 ); s32 value = core::clamp( core::floor32(f), 0.f, 255.f );
value |= value << 8; value |= value << 8;
value |= value << 16; value |= value << 16;
...@@ -454,7 +453,7 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF ...@@ -454,7 +453,7 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF
/* /*
Generate Texture Coordinates Generate Texture Coordinates
*/ */
void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFunction &function ) void CQuake3ShaderSceneNode::vertextransform_tcgen( f32 dt, quake3::SModifierFunction &function )
{ {
u32 i; u32 i;
const u32 vsize = MeshBuffer->Vertices.size(); const u32 vsize = MeshBuffer->Vertices.size();
...@@ -464,7 +463,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu ...@@ -464,7 +463,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
case 12: case 12:
//tcgen turb //tcgen turb
{ {
function.wave = core::reciprocal ( function.wave ); function.wave = core::reciprocal( function.wave );
const f32 phase = function.phase; const f32 phase = function.phase;
...@@ -473,10 +472,10 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu ...@@ -473,10 +472,10 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
const video::S3DVertex2TCoords &src = Original->Vertices[i]; const video::S3DVertex2TCoords &src = Original->Vertices[i];
video::S3DVertex &dst = MeshBuffer->Vertices[i]; video::S3DVertex &dst = MeshBuffer->Vertices[i];
f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave; const f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
function.phase = phase + wavephase; function.phase = phase + wavephase;
const f32 f = function.evaluate ( dt ); const f32 f = function.evaluate( dt );
dst.TCoords.X = src.TCoords.X + f * src.Normal.X; dst.TCoords.X = src.TCoords.X + f * src.Normal.X;
dst.TCoords.Y = src.TCoords.Y + f * src.Normal.Y; dst.TCoords.Y = src.TCoords.Y + f * src.Normal.Y;
...@@ -507,21 +506,21 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu ...@@ -507,21 +506,21 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
core::vector3df eyePlaneS; core::vector3df eyePlaneS;
core::vector3df eyePlaneT; core::vector3df eyePlaneT;
viewinverse.transformVect ( eyePlaneS, core::vector3df ( 1.f, 0.f, 0.f ) ); viewinverse.transformVect( eyePlaneS, core::vector3df(1.f, 0.f, 0.f) );
viewinverse.transformVect ( eyePlaneT, core::vector3df ( 0.f, 1.f, 0.f ) ); viewinverse.transformVect( eyePlaneT, core::vector3df(0.f, 1.f, 0.f) );
eyePlaneS.normalize (); eyePlaneS.normalize();
eyePlaneT.normalize (); eyePlaneT.normalize();
core::vector3df v; core::vector3df v;
for ( i = 0; i != vsize; ++i ) for ( i = 0; i != vsize; ++i )
{ {
// vertex in eye space // vertex in eye space
view.transformVect ( v, Original->Vertices[i].Pos ); view.transformVect( v, Original->Vertices[i].Pos );
v.normalize(); v.normalize();
MeshBuffer->Vertices[i].TCoords.X = (1.f + eyePlaneS.dotProduct ( v ) ) * 0.5f; MeshBuffer->Vertices[i].TCoords.X = (1.f + eyePlaneS.dotProduct(v) ) * 0.5f;
MeshBuffer->Vertices[i].TCoords.Y = 1.f - ( (1.f + eyePlaneT.dotProduct ( v ) ) * 0.5f ); MeshBuffer->Vertices[i].TCoords.Y = 1.f - ( (1.f + eyePlaneT.dotProduct(v) ) * 0.5f );
} }
} break; } break;
...@@ -534,7 +533,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu ...@@ -534,7 +533,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
/* /*
Transform Texture Coordinates Transform Texture Coordinates
*/ */
void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 addressMode ) void CQuake3ShaderSceneNode::transformtex( const core::matrix4 &m, const u32 addressMode )
{ {
u32 i; u32 i;
const u32 vsize = MeshBuffer->Vertices.size(); const u32 vsize = MeshBuffer->Vertices.size();
...@@ -568,8 +567,8 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad ...@@ -568,8 +567,8 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad
tx.X = tx1 <= 0.f ? 0.f : tx1 >= 1.f ? 1.f : tx1; tx.X = tx1 <= 0.f ? 0.f : tx1 >= 1.f ? 1.f : tx1;
tx.Y = ty1 <= 0.f ? 0.f : ty1 >= 1.f ? 1.f : ty1; tx.Y = ty1 <= 0.f ? 0.f : ty1 >= 1.f ? 1.f : ty1;
//tx.X = core::clamp ( tx1, 0.f, 1.f ); //tx.X = core::clamp( tx1, 0.f, 1.f );
//tx.Y = core::clamp ( ty1, 0.f, 1.f ); //tx.Y = core::clamp( ty1, 0.f, 1.f );
} }
} }
} }
...@@ -586,13 +585,13 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad ...@@ -586,13 +585,13 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad
*/ */
void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
{ {
const quake3::SVarGroup *group = Shader->getGroup ( stage ); const quake3::SVarGroup *group = Shader->getGroup( stage );
// select current texture // select current texture
if ( Q3Texture [ stage ].TextureFrequency != 0.f ) if ( Q3Texture [ stage ].TextureFrequency != 0.f )
{ {
s32 v = core::floor32 ( TimeAbs * Q3Texture [ stage ].TextureFrequency ); s32 v = core::floor32( TimeAbs * Q3Texture[stage].TextureFrequency );
Q3Texture [ stage ].TextureIndex = v % Q3Texture [ stage ].Texture.size(); Q3Texture [ stage ].TextureIndex = v % Q3Texture[stage].Texture.size();
} }
core::matrix4 m2; core::matrix4 m2;
...@@ -602,7 +601,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -602,7 +601,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
f32 f1; f32 f1;
// walk group for all modifiers // walk group for all modifiers
for ( u32 g = 0; g != group->Variable.size (); ++g ) for ( u32 g = 0; g != group->Variable.size(); ++g )
{ {
const quake3::SVariable &v = group->Variable[g]; const quake3::SVariable &v = group->Variable[g];
...@@ -613,7 +612,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -613,7 +612,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
}; };
u32 pos = 0; u32 pos = 0;
function.masterfunc0 = quake3::isEqual ( v.name, pos, modifierList, 5 ); function.masterfunc0 = quake3::isEqual( v.name, pos, modifierList, 5 );
if ( -2 == function.masterfunc0 ) if ( -2 == function.masterfunc0 )
continue; continue;
...@@ -622,7 +621,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -622,7 +621,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
{ {
//tcmod //tcmod
case 0: case 0:
m2.makeIdentity (); m2.makeIdentity();
break; break;
} }
...@@ -636,26 +635,25 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -636,26 +635,25 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
}; };
pos = 0; pos = 0;
function.masterfunc1 = quake3::isEqual ( v.content, pos, funclist, 14 ); function.masterfunc1 = quake3::isEqual( v.content, pos, funclist, 14 );
switch ( function.masterfunc1 ) switch ( function.masterfunc1 )
{ {
case 0: case 0:
// scroll // scroll
f0 = quake3::getAsFloat ( v.content, pos ) * TimeAbs; f0 = quake3::getAsFloat( v.content, pos ) * TimeAbs;
f1 = quake3::getAsFloat ( v.content, pos ) * TimeAbs; f1 = quake3::getAsFloat( v.content, pos ) * TimeAbs;
m2.setTextureTranslate ( f0, f1 ); m2.setTextureTranslate( f0, f1 );
break; break;
case 1: case 1:
// scale // scale
f0 = quake3::getAsFloat ( v.content, pos ); f0 = quake3::getAsFloat( v.content, pos );
f1 = quake3::getAsFloat ( v.content, pos ); f1 = quake3::getAsFloat( v.content, pos );
m2.setTextureScale ( f0, f1 ); m2.setTextureScale( f0, f1 );
break; break;
case 2: case 2:
//rotate //rotate
m2.setTextureRotationCenter ( quake3::getAsFloat ( v.content, pos ) * core::DEGTORAD * TimeAbs ); m2.setTextureRotationCenter( quake3::getAsFloat( v.content, pos ) * core::DEGTORAD * TimeAbs );
m2 = m2.getTransposed();
break; break;
case 3: case 3:
case 4: case 4:
...@@ -666,28 +664,26 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -666,28 +664,26 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
// turb == sin, default == sin // turb == sin, default == sin
function.func = 0; function.func = 0;
if ( function.masterfunc1 == 5 && function.masterfunc0 == 1) if (function.masterfunc1 == 5 && function.masterfunc0 == 1)
{ {
// deformvertexes, wave // deformvertexes, wave
function.wave = quake3::getAsFloat ( v.content, pos ); function.wave = quake3::getAsFloat( v.content, pos );
} }
if ( function.masterfunc1 == 3 || if (function.masterfunc1 == 3 ||
function.masterfunc1 == 4 || function.masterfunc1 == 4 ||
function.masterfunc1 == 5 function.masterfunc1 == 5)
)
{ {
// stretch, wave, tub // stretch, wave, tub
quake3::getModifierFunc ( function, v.content, pos ); quake3::getModifierFunc( function, v.content, pos );
} }
switch ( function.masterfunc1 ) switch ( function.masterfunc1 )
{ {
case 3: case 3:
// stretch // stretch
f0 = core::reciprocal ( function.evaluate ( TimeAbs ) ); f0 = core::reciprocal( function.evaluate(TimeAbs) );
m2.setTextureScaleCenter ( f0, f0 ); m2.setTextureScaleCenter( f0, f0 );
m2 = m2.getTransposed();
break; break;
case 4: case 4:
{ {
...@@ -698,30 +694,30 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -698,30 +694,30 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
ampFunction.freq = function.freq; ampFunction.freq = function.freq;
ampFunction.base = 1.f; ampFunction.base = 1.f;
ampFunction.amp = 0.2f; ampFunction.amp = 0.2f;
f2 = ampFunction.evaluate ( TimeAbs ); f2 = ampFunction.evaluate( TimeAbs );
f0 = function.evaluate ( TimeAbs ); f0 = function.evaluate( TimeAbs );
function.func = 1; function.func = 1;
f1 = function.evaluate ( TimeAbs ); f1 = function.evaluate( TimeAbs );
m2.setTextureTranslate ( f0, f1 ); m2.setTextureTranslate( f0, f1 );
m2.setTextureScaleCenter ( f2, f2 ); m2.setTextureScaleCenter( f2, f2 );
//m2.setTextureScale ( f2, f2 ); //m2.setTextureScale( f2, f2 );
*/ */
}break; }break;
case 5: case 5:
if ( function.masterfunc0 == 1 ) if ( function.masterfunc0 == 1 )
{ {
vertextransform_wave ( TimeAbs, function ); vertextransform_wave( TimeAbs, function );
} }
else else
{ {
vertextransform_rgbgen ( TimeAbs, function ); vertextransform_rgbgen( TimeAbs, function );
} }
break; break;
case 6: case 6:
case 7: case 7:
vertextransform_rgbgen ( TimeAbs, function ); vertextransform_rgbgen( TimeAbs, function );
break; break;
} }
...@@ -738,17 +734,17 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -738,17 +734,17 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
break; break;
case 12: case 12:
// deformvertexes bulge // deformvertexes bulge
function.bulgewidth = quake3::getAsFloat ( v.content, pos ); function.bulgewidth = quake3::getAsFloat( v.content, pos );
function.bulgeheight = quake3::getAsFloat ( v.content, pos ); function.bulgeheight = quake3::getAsFloat( v.content, pos );
function.bulgespeed = quake3::getAsFloat ( v.content, pos ); function.bulgespeed = quake3::getAsFloat( v.content, pos );
vertextransform_bulge ( TimeAbs, function ); vertextransform_bulge(TimeAbs, function);
break; break;
case 13: case 13:
case 14: case 14:
// deformvertexes autosprite // deformvertexes autosprite
vertextransform_autosprite ( TimeAbs, function); vertextransform_autosprite(TimeAbs, function);
break; break;
} // func } // func
...@@ -763,20 +759,19 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture ) ...@@ -763,20 +759,19 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
} // group } // group
// texture coordinate modifier // texture coordinate modifier
vertextransform_tcgen ( TimeAbs, function); vertextransform_tcgen(TimeAbs, function);
} }
void CQuake3ShaderSceneNode::OnAnimate(u32 timeMs) void CQuake3ShaderSceneNode::OnAnimate(u32 timeMs)
{ {
TimeAbs = f32( timeMs ) * ( 1.f/1000.f); TimeAbs = f32( timeMs ) * (1.f/1000.f);
ISceneNode::OnAnimate ( timeMs ); ISceneNode::OnAnimate( timeMs );
} }
const core::aabbox3d<f32>& CQuake3ShaderSceneNode::getBoundingBox() const const core::aabbox3d<f32>& CQuake3ShaderSceneNode::getBoundingBox() const
{ {
return MeshBuffer->getBoundingBox (); return MeshBuffer->getBoundingBox();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment