| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : wwphys *
- * *
- * $Archive:: /Commando/Code/wwphys/grideffect.cpp $*
- * *
- * Original Author:: Greg Hjelstrom *
- * *
- * $Author:: Jani_p $*
- * *
- * $Modtime:: 7/23/01 4:46p $*
- * *
- * $Revision:: 4 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "grideffect.h"
- #include "ww3d.h"
- #include "physresourcemgr.h"
- #include "vertmaterial.h"
- #include "matpass.h"
- #include "matrixmapper.h"
- #include "rinfo.h"
- #include "camera.h"
- #include "phys.h"
- /***********************************************************************************************
- **
- ** GridEffectClass Implementation
- **
- ***********************************************************************************************/
- const float DEFAULT_GRID_PARAMTER_RATE = 0.5f;
- GridEffectClass::GridEffectClass(void) :
- CurrentParameter(0.0f),
- TargetParameter(1.0f),
- ParameterRate(DEFAULT_GRID_PARAMTER_RATE),
- LastRenderTime(0),
- RenderBaseMaterial(true),
- RenderGridMaterial(false),
- Stage0Mapper(NULL),
- Stage1Mapper(NULL),
- MaterialPass(NULL)
- {
- LastRenderTime = WW3D::Get_Sync_Time();
- MaterialPass = NEW_REF(MaterialPassClass,());
-
- VertexMaterialClass * vmtl = PhysResourceMgrClass::Create_Emissive_Material();
- Stage0Mapper = NEW_REF(MatrixMapperClass,(0));
- Stage0Mapper->Set_Type(MatrixMapperClass::DEPTH_GRADIENT);
- vmtl->Set_Mapper(Stage0Mapper,0);
-
- Stage1Mapper = NEW_REF(MatrixMapperClass,(1));
- Stage1Mapper->Set_Type(MatrixMapperClass::DEPTH_GRADIENT);
- vmtl->Set_Mapper(Stage1Mapper,1);
-
- MaterialPass->Set_Material(vmtl);
- REF_PTR_RELEASE(vmtl);
-
- ShaderClass shader = ShaderClass::_PresetAdditiveShader;
- shader.Set_Post_Detail_Color_Func(ShaderClass::DETAILCOLOR_ADD);
- MaterialPass->Set_Shader(shader);
-
- MaterialPass->Set_Texture(PhysResourceMgrClass::Peek_Grid_Texture(),0);
- MaterialPass->Set_Texture(PhysResourceMgrClass::Peek_Grid_Texture(),1);
- }
- GridEffectClass::~GridEffectClass(void)
- {
- REF_PTR_RELEASE(Stage0Mapper);
- REF_PTR_RELEASE(Stage1Mapper);
- REF_PTR_RELEASE(MaterialPass);
- }
-
- void GridEffectClass::Render_Push(RenderInfoClass & rinfo,PhysClass * obj)
- {
- if (CurrentParameter == TargetParameter) {
- if (CurrentParameter < 0.5f) {
- TargetParameter = 1.0f;
- } else {
- TargetParameter = 0.0f;
- }
- }
- /*
- ** Update the grid properties
- ** - compute dt since last render
- ** - update the parameter
- ** - compute the intensity, if it is above 0.0 then:
- ** - compute the texture transform given this camera, update the mappers
- ** - compute the texel row, update the mappers
- */
- int millisecs = WW3D::Get_Sync_Time() - LastRenderTime;
- LastRenderTime = WW3D::Get_Sync_Time();
- float dt = (float)millisecs / 1000.0f;
- float parameter_step = ParameterRate * dt;
- if (parameter_step > WWMath::Fabs(TargetParameter - CurrentParameter)) {
- CurrentParameter = TargetParameter;
- } else {
- if (TargetParameter < CurrentParameter) {
- CurrentParameter -= parameter_step;
- } else {
- CurrentParameter += parameter_step;
- }
- }
- static float _angle = 0.0f;
- static float _angle_delta = 0.001f;
- _angle += _angle_delta;
- GridTransform = obj->Get_Transform();
- Matrix3D camera_tm = rinfo.Camera.Get_Transform();
- Matrix3D xgridtm;
- GridTransform.Get_Inverse(xgridtm);
- // xgridtm.Rotate_Y(DEG_TO_RADF(90.0f));
- Matrix4 tm = Matrix4(xgridtm) * Matrix4(camera_tm);
- Stage0Mapper->Set_Texture_Transform(Matrix4(tm),64.0f);
- Stage0Mapper->Set_Gradient_U_Coord(CurrentParameter);
- Matrix3D ygridtm;
- GridTransform.Get_Inverse(ygridtm);
- // ygridtm.Rotate_X(DEG_TO_RADF(90.0f));
- tm = Matrix4(ygridtm) * Matrix4(camera_tm);
- Stage1Mapper->Set_Texture_Transform(tm,64.0f);
- Stage1Mapper->Set_Gradient_U_Coord(CurrentParameter);
-
- RenderBaseMaterial = (CurrentParameter < 0.5f);
- /*
- ** Push this pass if it is visible, decide whether or not to render the base passes
- */
- rinfo.Push_Material_Pass(MaterialPass);
-
- if (RenderBaseMaterial == false) {
- rinfo.Push_Override_Flags(RenderInfoClass::RINFO_OVERRIDE_ADDITIONAL_PASSES_ONLY);
- }
- }
- void GridEffectClass::Render_Pop(RenderInfoClass & rinfo)
- {
- if (RenderBaseMaterial == false) {
- rinfo.Pop_Override_Flags();
- }
- rinfo.Pop_Material_Pass();
- }
- void GridEffectClass::Set_Grid_Transform(const Matrix3D & tm)
- {
- GridTransform = tm;
- }
- const Matrix3D & GridEffectClass::Get_Grid_Transform(void)
- {
- return GridTransform;
- }
- void GridEffectClass::Set_Texture(TextureClass * tex)
- {
- MaterialPass->Set_Texture(tex);
- }
- TextureClass * GridEffectClass::Peek_Texture(void)
- {
- return MaterialPass->Peek_Texture();
- }
|