Torque3D Documentation / _generateds / terrMaterial.cpp

terrMaterial.cpp

Engine/source/terrain/terrMaterial.cpp

More...

Public Functions

ConsoleDocClass(TerrainMaterial , "@brief The <a href="/coding/class/classterrainmaterial/">TerrainMaterial</a> class orginizes the material settings " "<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> single terrain material <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">layer.\n\n</a>" "@note You should not be creating TerrainMaterials by hand in code. " "All TerrainMaterials should be created in the editors, as intended " "by the <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">system.\n\n</a>" " @<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">tsexample\n</a>" "//Created by the Terrain Painter tool in the <a href="/coding/file/gizmo_8h/#gizmo_8h_1a10fcd3bee2ea25191e31795e36bdeba1a81f4537631c9ab219ec74de554483adc">World</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Editor\n</a>" "<a href="/coding/file/tmm__on_8h/#tmm__on_8h_1a1ac41480eb2e4aadd52252ee550b630a">new</a> <a href="/coding/class/classterrainmaterial/">TerrainMaterial</a>()\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "{\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" " internalName=\"grass1\";\n" "	diffuseMap = \"art/terrains/Test/grass1\";\n" "	detailMap = \"art/terrains/Test/grass1_d\";\n" "	detailSize = \"10\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	isManaged = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	detailBrightness = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	Enabled = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	diffuseSize = \"200\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "};\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "@<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">endtsexample\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Materials\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">enviroMisc\n</a>" )

Detailed Description

Public Functions

ConsoleDocClass(TerrainMaterial , "@brief The <a href="/coding/class/classterrainmaterial/">TerrainMaterial</a> class orginizes the material settings " "<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> single terrain material <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">layer.\n\n</a>" "@note You should not be creating TerrainMaterials by hand in code. " "All TerrainMaterials should be created in the editors, as intended " "by the <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">system.\n\n</a>" " @<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">tsexample\n</a>" "//Created by the Terrain Painter tool in the <a href="/coding/file/gizmo_8h/#gizmo_8h_1a10fcd3bee2ea25191e31795e36bdeba1a81f4537631c9ab219ec74de554483adc">World</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Editor\n</a>" "<a href="/coding/file/tmm__on_8h/#tmm__on_8h_1a1ac41480eb2e4aadd52252ee550b630a">new</a> <a href="/coding/class/classterrainmaterial/">TerrainMaterial</a>()\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "{\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" " internalName=\"grass1\";\n" "	diffuseMap = \"art/terrains/Test/grass1\";\n" "	detailMap = \"art/terrains/Test/grass1_d\";\n" "	detailSize = \"10\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	isManaged = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	detailBrightness = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	Enabled = \"1\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "	diffuseSize = \"200\";\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "};\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "@<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">endtsexample\n\n</a>" "@see <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Materials\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">enviroMisc\n</a>" )

IMPLEMENT_CONOBJECT(TerrainMaterial )

  1
  2//-----------------------------------------------------------------------------
  3// Copyright (c) 2012 GarageGames, LLC
  4//
  5// Permission is hereby granted, free of charge, to any person obtaining a copy
  6// of this software and associated documentation files (the "Software"), to
  7// deal in the Software without restriction, including without limitation the
  8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  9// sell copies of the Software, and to permit persons to whom the Software is
 10// furnished to do so, subject to the following conditions:
 11//
 12// The above copyright notice and this permission notice shall be included in
 13// all copies or substantial portions of the Software.
 14//
 15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 21// IN THE SOFTWARE.
 22//-----------------------------------------------------------------------------
 23
 24#include "platform/platform.h"
 25#include "terrain/terrMaterial.h"
 26#include "console/consoleTypes.h"
 27#include "gfx/gfxTextureManager.h"
 28#include "gfx/bitmap/gBitmap.h"
 29
 30#include <string>
 31
 32
 33IMPLEMENT_CONOBJECT( TerrainMaterial );
 34
 35ConsoleDocClass( TerrainMaterial,
 36   "@brief The TerrainMaterial class orginizes the material settings "
 37   "for a single terrain material layer.\n\n"
 38
 39   "@note You should not be creating TerrainMaterials by hand in code. "
 40   "All TerrainMaterials should be created in the editors, as intended "
 41   "by the system.\n\n"
 42
 43   "@tsexample\n"
 44   "// Created by the Terrain Painter tool in the World Editor\n"
 45   "new TerrainMaterial()\n"
 46   "{\n"
 47   "  internalName = \"grass1\";\n"
 48   "  diffuseMap = \"art/terrains/Test/grass1\";\n"
 49   "  detailMap = \"art/terrains/Test/grass1_d\";\n"
 50   "  detailSize = \"10\";\n"
 51   "  isManaged = \"1\";\n"
 52   "  detailBrightness = \"1\";\n"
 53   "  Enabled = \"1\";\n"
 54   "  diffuseSize = \"200\";\n"
 55   "};\n"
 56   "@endtsexample\n\n"
 57
 58   "@see Materials\n"
 59
 60   "@ingroup enviroMisc\n");
 61
 62TerrainMaterial::TerrainMaterial()
 63   :  mDiffuseSize( 500.0f ),
 64      mDetailSize( 5.0f ),
 65      mDetailStrength( 1.0f ),
 66      mDetailDistance( 50.0f ),
 67      mSideProjection( false ),
 68      mMacroSize( 200.0f ),
 69      mMacroStrength( 0.7f ),
 70      mMacroDistance( 500.0f ),
 71      mParallaxScale( 0.0f ),
 72      mBlendDepth( 0.0f ),
 73      mBlendContrast( 1.0f ),
 74      mIsSRGB(false),
 75      mInvertRoughness(false)
 76{
 77   initMapSlot(DiffuseMap);
 78   initMapSlot(NormalMap);
 79   initMapSlot(DetailMap);
 80   initMapSlot(ORMConfigMap);
 81   initMapSlot(MacroMap);
 82}
 83
 84TerrainMaterial::~TerrainMaterial()
 85{
 86}
 87
 88void TerrainMaterial::initPersistFields()
 89{
 90   scriptBindMapSlot(DiffuseMap, TerrainMaterial,"Base Albedo stretched over the whole map");
 91   addField( "diffuseSize", TypeF32, Offset( mDiffuseSize, TerrainMaterial ), "Used to scale the diffuse map to the material square" );
 92
 93   scriptBindMapSlot(NormalMap, TerrainMaterial,"NormalMap");
 94   addField( "parallaxScale", TypeF32, Offset( mParallaxScale, TerrainMaterial ), "Used to scale the height from the normal map to give some self "
 95      "occlusion effect (aka parallax) to the terrain material" );
 96
 97   addField("blendHeightBase", TypeF32, Offset(mBlendDepth, TerrainMaterial), "A fixed value to add while blending using heightmap-based blending."
 98      "Higher numbers = larger blend radius.");
 99
100   addField("blendHeightContrast", TypeF32, Offset(mBlendContrast, TerrainMaterial), "A fixed value to add while blending using heightmap-based blending."
101      "Higher numbers = larger blend radius.");
102
103   scriptBindMapSlot(DetailMap, TerrainMaterial, "Raises and lowers the RGB result of the Base Albedo up close.");
104   addField( "detailSize", TypeF32, Offset( mDetailSize, TerrainMaterial ), "Used to scale the detail map to the material square" );
105   addField( "detailStrength", TypeF32, Offset( mDetailStrength, TerrainMaterial ), "Exponentially sharpens or lightens the detail map rendering on the material" );
106   addField( "detailDistance", TypeF32, Offset( mDetailDistance, TerrainMaterial ), "Changes how far camera can see the detail map rendering on the material" );
107
108   addField( "useSideProjection", TypeBool, Offset( mSideProjection, TerrainMaterial ),"Makes that terrain material project along the sides of steep "
109      "slopes instead of projected downwards");
110
111   scriptBindMapSlot(ORMConfigMap, TerrainMaterial, "AO|Roughness|metalness map (uses DetailMap UV Coords)");
112   addField("isSRGB", TypeBool, Offset(mIsSRGB, TerrainMaterial), "Is the PBR Config map's image in sRGB format?");
113   addField("invertRoughness", TypeBool, Offset(mInvertRoughness, TerrainMaterial), "Should the roughness channel of the PBR Config map be inverted?");
114
115   //Macro maps additions
116   scriptBindMapSlot(MacroMap, TerrainMaterial, "Raises and lowers the RGB result of the Base Albedo at a distance.");
117   addField( "macroSize", TypeF32, Offset( mMacroSize, TerrainMaterial ), "Used to scale the Macro map to the material square" );
118   addField( "macroStrength", TypeF32, Offset( mMacroStrength, TerrainMaterial ), "Exponentially sharpens or lightens the Macro map rendering on the material" );
119   addField( "macroDistance", TypeF32, Offset( mMacroDistance, TerrainMaterial ), "Changes how far camera can see the Macro map rendering on the material" );
120
121   Parent::initPersistFields();
122
123   // Gotta call this at least once or it won't get created!
124   Sim::getTerrainMaterialSet();
125}
126
127bool TerrainMaterial::onAdd()
128{
129   if ( !Parent::onAdd() )
130      return false;
131
132   SimSet *set = Sim::getTerrainMaterialSet();
133
134   // Make sure we have an internal name set.
135   if ( !mInternalName || !mInternalName[0] )
136      Con::warnf( "TerrainMaterial::onAdd() - No internal name set!" );
137   else
138   {
139      SimObject *object = set->findObjectByInternalName( mInternalName );
140      if ( object )
141         Con::warnf( "TerrainMaterial::onAdd() - Internal name collision; '%s' already exists!", mInternalName );
142   }  
143
144   //bind any assets we have
145   bindMapSlot(DiffuseMap);
146   bindMapSlot(NormalMap);
147   bindMapSlot(DetailMap);
148   bindMapSlot(ORMConfigMap);
149   bindMapSlot(MacroMap);
150
151   set->addObject( this );
152
153   return true;
154}
155
156TerrainMaterial* TerrainMaterial::getWarningMaterial()
157{ 
158   return findOrCreate( NULL );
159}
160
161TerrainMaterial* TerrainMaterial::findOrCreate( const char *nameOrPath )
162{
163   SimSet *set = Sim::getTerrainMaterialSet();
164   
165   if ( !nameOrPath || !nameOrPath[0] )
166      nameOrPath = "warning_material";
167
168   // See if we can just find it.
169   TerrainMaterial *mat = dynamic_cast<TerrainMaterial*>( set->findObjectByInternalName( StringTable->insert( nameOrPath ) ) );
170   if ( mat )
171      return mat;
172
173   // We didn't find it... so see if its a path to a
174   // file.  If it is lets assume its the texture.
175   if ( GBitmap::sFindFiles( nameOrPath, NULL ) )
176   {
177      mat = new TerrainMaterial();
178      mat->setInternalName( nameOrPath );
179      mat->mDiffuseMapFilename = nameOrPath;
180      mat->registerObject();
181      Sim::getRootGroup()->addObject( mat );
182      return mat;
183   }
184
185   // Ok... return a debug material then.
186   mat = dynamic_cast<TerrainMaterial*>( set->findObjectByInternalName( StringTable->insert( "warning_material" ) ) );
187   if ( !mat )
188   {
189      // This shouldn't happen.... the warning_texture should
190      // have already been defined in script, but we put this
191      // fallback here just in case it gets "lost".
192      mat = new TerrainMaterial();
193      mat->setInternalName( "warning_material" );
194      mat->mDiffuseMapFilename = GFXTextureManager::getWarningTexturePath();
195      mat->mDiffuseSize = 500;
196      mat->mDetailMapFilename = GFXTextureManager::getWarningTexturePath();
197      mat->mDetailSize = 5;
198     mat->mMacroMapFilename = GFXTextureManager::getWarningTexturePath();
199     mat->mMacroSize = 200;
200      mat->registerObject();
201      
202      Sim::getRootGroup()->addObject( mat );
203   }
204
205   return mat;
206}
207