|
From: <axl...@us...> - 2009-12-28 22:26:35
|
Revision: 645
http://hgengine.svn.sourceforge.net/hgengine/?rev=645&view=rev
Author: axlecrusher
Date: 2009-12-28 22:26:28 +0000 (Mon, 28 Dec 2009)
Log Message:
-----------
use state changers to affect particles for better looking fire
Modified Paths:
--------------
Mercury2/Themes/default/File/scenegraph.xml
Mercury2/Themes/default/Graphic/FireParticles.frag
Mercury2/Themes/default/Graphic/FireParticles.vert
Mercury2/modules/ParticleEmitter.cpp
Mercury2/src/StateChanger.cpp
Modified: Mercury2/Themes/default/File/scenegraph.xml
===================================================================
--- Mercury2/Themes/default/File/scenegraph.xml 2009-12-24 21:28:19 UTC (rev 644)
+++ Mercury2/Themes/default/File/scenegraph.xml 2009-12-28 22:26:28 UTC (rev 645)
@@ -3,6 +3,8 @@
<asset type="StateChanger" file="ColorChange:1,1,1,1" />
<asset type="StateChanger" file="DepthTest:1" />
<asset type="StateChanger" file="LightingSwitch:0" />
+ <asset type="StateChanger" file="DepthWrite:1" />
+ <asset type="StateChanger" file="BlendFunc:SRC_ALPHA,ONE_MINUS_SRC_ALPHA" />
<node type="viewport" fov="45" aspect="1.3333" near="0.01" far="100" name="vp">
<node type="cameranode" movx="0" movz="0" movy="0" rotx="0" roty="0" rotz="0" name="camera">
<node type="transformnode" movz="-5" movy=".2">
@@ -36,6 +38,8 @@
state changer needs some work for proper on and off.
until then had code it for all particles -->
<node type="transformnode" scalex="0.1" scaley="0.1" scalez="0.1">
+ <asset type="StateChanger" file="DepthWrite:0" />
+ <asset type="StateChanger" file="BlendFunc:ONE,ONE" />
<asset type="shader" file="GRAPHIC:FireParticles"/>
<asset type="texture" file="GRAPHIC:flame2.png"/>
<node type="particleemitter"/>
Modified: Mercury2/Themes/default/Graphic/FireParticles.frag
===================================================================
--- Mercury2/Themes/default/Graphic/FireParticles.frag 2009-12-24 21:28:19 UTC (rev 644)
+++ Mercury2/Themes/default/Graphic/FireParticles.frag 2009-12-28 22:26:28 UTC (rev 645)
@@ -1,22 +1,34 @@
uniform sampler2D HG_Texture0;
varying vec4 particleData;
+vec3 Blend(vec3 c1, vec3 c2, float p)
+{
+ return c1*(1.0-p) + c2*p;
+}
+
void main()
{
float pComplete = (particleData.x/particleData.y);
- vec4 blue = vec4(0,0,1,0.125);
- vec4 orange = vec4(1,0.917647059,0.11372549,1);
- vec4 color = vec4(0,0,0,0);
+ vec3 blue = vec3(0,0,1);
+ vec3 orange = vec3(1,0.917647059,0.1372549);
+ vec3 color = vec3(0,0,0);
//blues
- color += blue*(1.0-(pComplete*5.0))*float(pComplete<0.2); //blue
- color += 1.25*orange*(pComplete*5.0)*float(pComplete<0.2); //orange
+ color += Blend(blue, orange, min(1.0,pComplete*3.33))*float(pComplete<0.5);
+ color += Blend(orange, vec3(-3), (pComplete-0.5)*2.0)*float(pComplete>0.5);
+// color += blue*(1.0-(pComplete*3.33))*float(pComplete<0.3); //blue
+// color += orange*(pComplete*3.33)*float(pComplete<0.3); //orange
+
//orange to black fade
- color += 1.25*orange*(1.0-(pComplete-0.2))*float(pComplete>0.2); //orange
- color += vec4(-1,-1,-1,1)*(pComplete)*float(pComplete>0.2); //smoke -1 offset
+// color += 1.25*orange*(1.0-(pComplete-0.2))*float(pComplete>0.2); //orange
+// color += vec4(-1,-1,-1,1)*(pComplete)*float(pComplete>0.2); //smoke -1 offset
- gl_FragData[0] = texture2D(HG_Texture0, gl_TexCoord[0].st)*color;
+ color.rgb *= texture2D(HG_Texture0, gl_TexCoord[0].st).a;
+ color.rgb *= 1.0-(particleData.x/particleData.y);
+
+ gl_FragData[0].rgb = texture2D(HG_Texture0, gl_TexCoord[0].st).rgb*color.rgb;
+ gl_FragData[0].a = texture2D(HG_Texture0, gl_TexCoord[0].st).a;
gl_FragData[0].a *= 1.0-(particleData.x/particleData.y);
}
Modified: Mercury2/Themes/default/Graphic/FireParticles.vert
===================================================================
--- Mercury2/Themes/default/Graphic/FireParticles.vert 2009-12-24 21:28:19 UTC (rev 644)
+++ Mercury2/Themes/default/Graphic/FireParticles.vert 2009-12-28 22:26:28 UTC (rev 645)
@@ -53,7 +53,7 @@
particleData = gl_Color;
vec4 pos = vec4(1.0);
- pos.y = 0.3*(particleData.x*particleData.x);
+ pos.y = 0.3*(particleData.x*particleData.x) + 1.5*(particleData.x/particleData.y);
pos.x = 0.40*((particleData.z-50000.0)/50000.0)*particleData.x; //rand num
pos.z = 0.40*((particleData.w-50000.0)/50000.0)*particleData.x; //rand num
@@ -61,9 +61,9 @@
m[3].xyz = pos.xyz;
mat4 s = mat4(0.0);
- s[0][0] = 1.0+3.0*(particleData.x/particleData.y);
- s[1][1] = 1.0+3.0*(particleData.x/particleData.y);
- s[2][2] = 1.0+3.0*(particleData.x/particleData.y);
+ s[0][0] = 0.5+3.0*(particleData.x/particleData.y);
+ s[1][1] = 0.5+3.0*(particleData.x/particleData.y);
+ s[2][2] = 0.5+3.0*(particleData.x/particleData.y);
s[3][3] = 1.0;
gl_Position = gl_ProjectionMatrix *HG_ViewMatrix *HG_ModelMatrix *m*s* gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
Modified: Mercury2/modules/ParticleEmitter.cpp
===================================================================
--- Mercury2/modules/ParticleEmitter.cpp 2009-12-24 21:28:19 UTC (rev 644)
+++ Mercury2/modules/ParticleEmitter.cpp 2009-12-28 22:26:28 UTC (rev 645)
@@ -257,8 +257,7 @@
void ParticleEmitter::Render(const MercuryMatrix& matrix)
{
- GLCALL( glPushAttrib(GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT) );
- GLCALL( glDepthMask( false ) );
+ GLCALL( glPushAttrib(GL_ENABLE_BIT|GL_CURRENT_BIT) );
GLCALL( glDisable(GL_CULL_FACE) );
if (m_bufferID==0)
Modified: Mercury2/src/StateChanger.cpp
===================================================================
--- Mercury2/src/StateChanger.cpp 2009-12-24 21:28:19 UTC (rev 644)
+++ Mercury2/src/StateChanger.cpp 2009-12-28 22:26:28 UTC (rev 645)
@@ -35,7 +35,7 @@
void Activate()
{
- glColor4f( r,g,b,a );
+ GLCALL( glColor4f( r,g,b,a ) );
}
STATECHANGE_RTTI( ColorChange );
@@ -67,9 +67,13 @@
void Activate()
{
if( bEnable )
- glEnable( GL_LIGHTING );
+ {
+ GLCALL( glEnable( GL_LIGHTING ) );
+ }
else
- glDisable( GL_LIGHTING );
+ {
+ GLCALL( glDisable( GL_LIGHTING ) );
+ }
}
STATECHANGE_RTTI( LightingSwitch );
@@ -101,9 +105,13 @@
void Activate()
{
if( bEnable )
- glEnable( GL_DEPTH_TEST );
+ {
+ GLCALL( glEnable( GL_DEPTH_TEST ) );
+ }
else
- glDisable( GL_DEPTH_TEST );
+ {
+ GLCALL( glDisable( GL_DEPTH_TEST ) );
+ }
}
STATECHANGE_RTTI( DepthTest );
@@ -133,7 +141,7 @@
void Activate()
{
- glDepthMask( bEnable );
+ GLCALL( glDepthMask( bEnable ) );
}
STATECHANGE_RTTI( DepthWrite );
@@ -142,6 +150,58 @@
REGISTER_STATECHANGE( DepthWrite );
+class BlendFunc : public StateChange
+{
+public:
+ BlendFunc( const MVector< MString > & sParameters ) : StateChange( sParameters )
+ {
+ if( sParameters.size() < 2 )
+ {
+ LOG.Write( ssprintf( "Error: BlendFunc state has invalid number of parameters(%d).", sParameters.size() ) );
+ return;
+ }
+
+ m_src = StrToBlend(sParameters[0] );
+ m_dest = StrToBlend(sParameters[1] );
+ }
+
+ void Stringify( MString & sOut )
+ {
+ //XXX
+// sOut = ssprintf( "%f", bEnable );
+ }
+
+#define STRTOGL(x,s) if (x==#s) return GL_##s;
+ int StrToBlend(const MString& s)
+ {
+ STRTOGL(s, ZERO);
+ STRTOGL(s, ONE);
+ STRTOGL(s, SRC_COLOR);
+ STRTOGL(s, ONE_MINUS_SRC_COLOR);
+ STRTOGL(s, DST_COLOR);
+ STRTOGL(s, ONE_MINUS_DST_COLOR);
+ STRTOGL(s, SRC_ALPHA);
+ STRTOGL(s, ONE_MINUS_SRC_ALPHA);
+ STRTOGL(s, DST_ALPHA);
+ STRTOGL(s, ONE_MINUS_DST_ALPHA);
+ STRTOGL(s, CONSTANT_COLOR);
+ STRTOGL(s, ONE_MINUS_CONSTANT_COLOR);
+ STRTOGL(s, CONSTANT_ALPHA);
+ STRTOGL(s, ONE_MINUS_CONSTANT_ALPHA);
+ STRTOGL(s, SRC_ALPHA_SATURATE);
+ }
+
+ void Activate()
+ {
+ GLCALL( glBlendFunc(m_src,m_dest) );
+ }
+
+ STATECHANGE_RTTI( BlendFunc );
+ int m_src, m_dest;
+};
+
+REGISTER_STATECHANGE( BlendFunc );
+
//////////////////////////////////////STATE CHANGE CHUNK//////////////////////////////////////
StateChangeRegister & StateChangeRegister::Instance()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|