shaderGenHLSL.cpp
Engine/source/shaderGen/HLSL/shaderGenHLSL.cpp
Detailed Description
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 "shaderGen/HLSL/shaderGenHLSL.h" 26 27#include "shaderGen/HLSL/shaderCompHLSL.h" 28#include "shaderGen/featureMgr.h" 29 30 31void ShaderGenPrinterHLSL::printShaderHeader(Stream& stream) 32{ 33 const char *header1 = "//*****************************************************************************\r\n"; 34 const char *header2 = "// Torque -- HLSL procedural shader\r\n"; 35 36 stream.write( dStrlen(header1), header1 ); 37 stream.write( dStrlen(header2), header2 ); 38 stream.write( dStrlen(header1), header1 ); 39 40 const char* header3 = "\r\n"; 41 stream.write( dStrlen(header3), header3 ); 42} 43 44void ShaderGenPrinterHLSL::printMainComment(Stream& stream) 45{ 46 const char * header5 = "// Main\r\n"; 47 const char * line = "//-----------------------------------------------------------------------------\r\n"; 48 49 stream.write( dStrlen(line), line ); 50 stream.write( dStrlen(header5), header5 ); 51 stream.write( dStrlen(line), line ); 52} 53 54void ShaderGenPrinterHLSL::printVertexShaderCloser(Stream& stream) 55{ 56 const char *closer = " return OUT;\r\n}\r\n"; 57 stream.write( dStrlen(closer), closer ); 58} 59 60void ShaderGenPrinterHLSL::printPixelShaderOutputStruct(Stream& stream, const MaterialFeatureData &featureData) 61{ 62 // Determine the number of output targets we need 63 U32 numMRTs = 0; 64 for( U32 i = 0; i < FEATUREMGR->getFeatureCount(); i++ ) 65 { 66 const FeatureInfo &info = FEATUREMGR->getAt( i ); 67 if ( featureData.features.hasFeature( *info.type ) ) 68 numMRTs |= info.feature->getOutputTargets( featureData ); 69 } 70 71 WRITESTR("struct Fragout\r\n"); 72 WRITESTR("{\r\n"); 73 74 WRITESTR(" float4 col : SV_Target0;\r\n"); 75 for (U32 i = 1; i < 4; i++) 76 { 77 if (numMRTs & 1 << i) 78 WRITESTR(avar(" float4 col%d : SV_Target%d;\r\n", i, i)); 79 } 80 81 WRITESTR("};\r\n"); 82 WRITESTR("\r\n"); 83 WRITESTR("\r\n"); 84} 85 86void ShaderGenPrinterHLSL::printPixelShaderCloser(Stream& stream) 87{ 88 WRITESTR( "\r\n return OUT;\r\n}\r\n" ); 89} 90 91void ShaderGenPrinterHLSL::printLine(Stream& stream, const String& line) 92{ 93 stream.write(line.length(), line.c_str()); 94 const char* end = "\r\n"; 95 stream.write(dStrlen(end), end); 96} 97 98const char* ShaderGenComponentFactoryHLSL::typeToString( GFXDeclType type ) 99{ 100 switch ( type ) 101 { 102 default: 103 case GFXDeclType_Float: 104 return "float"; 105 106 case GFXDeclType_Float2: 107 return "float2"; 108 109 case GFXDeclType_Float3: 110 return "float3"; 111 112 case GFXDeclType_Float4: 113 case GFXDeclType_Color: 114 return "float4"; 115 116 case GFXDeclType_UByte4: 117 return "uint4"; 118 } 119} 120 121ShaderComponent* ShaderGenComponentFactoryHLSL::createVertexInputConnector( const GFXVertexFormat &vertexFormat ) 122{ 123 ShaderConnectorHLSL *vertComp = new ShaderConnectorHLSL; 124 vertComp->setName( "VertData" ); 125 126 // Loop thru the vertex format elements. 127 for ( U32 i=0; i < vertexFormat.getElementCount(); i++ ) 128 { 129 const GFXVertexElement &element = vertexFormat.getElement( i ); 130 131 Var *var = NULL; 132 133 if ( element.isSemantic( GFXSemantic::POSITION ) ) 134 { 135 var = vertComp->getElement( RT_POSITION ); 136 var->setName( "position" ); 137 } 138 else if ( element.isSemantic( GFXSemantic::NORMAL ) ) 139 { 140 var = vertComp->getElement( RT_NORMAL ); 141 var->setName( "normal" ); 142 } 143 else if ( element.isSemantic( GFXSemantic::TANGENT ) ) 144 { 145 var = vertComp->getElement( RT_TANGENT ); 146 var->setName( "T" ); 147 } 148 else if ( element.isSemantic( GFXSemantic::TANGENTW ) ) 149 { 150 var = vertComp->getIndexedElement(element.getSemanticIndex(), RT_TEXCOORD); 151 var->setName("tangentW"); 152 } 153 else if ( element.isSemantic( GFXSemantic::BINORMAL ) ) 154 { 155 var = vertComp->getElement( RT_BINORMAL ); 156 var->setName( "B" ); 157 } 158 else if ( element.isSemantic( GFXSemantic::COLOR ) ) 159 { 160 var = vertComp->getElement( RT_COLOR ); 161 var->setName( "diffuse" ); 162 } 163 else if ( element.isSemantic( GFXSemantic::TEXCOORD ) ) 164 { 165 var = vertComp->getIndexedElement( element.getSemanticIndex(), RT_TEXCOORD ); 166 if ( element.getSemanticIndex() == 0 ) 167 var->setName( "texCoord" ); 168 else 169 var->setName( String::ToString( "texCoord%d", element.getSemanticIndex() + 1 ) ); 170 } 171 else if ( element.isSemantic( GFXSemantic::BLENDINDICES ) ) 172 { 173 var = vertComp->getIndexedElement( element.getSemanticIndex(), RT_BLENDINDICES ); 174 var->setName( String::ToString( "blendIndices%d", element.getSemanticIndex() ) ); 175 } 176 else if ( element.isSemantic( GFXSemantic::BLENDWEIGHT ) ) 177 { 178 var = vertComp->getIndexedElement( element.getSemanticIndex(), RT_BLENDWEIGHT ); 179 var->setName( String::ToString( "blendWeight%d", element.getSemanticIndex() ) ); 180 } 181 else if ( element.isSemantic( GFXSemantic::PADDING ) ) 182 { 183 var = NULL; 184 //var = vertComp->getIndexedElement( vertComp->getCurTexElem() + element.getSemanticIndex(), RT_TEXCOORD ); 185 //var->setName( String::ToString( "pad%d", element.getSemanticIndex() + 1 ) ); 186 } 187 else 188 { 189 // Everything else is a texcoord! 190 var = vertComp->getIndexedElement( element.getSemanticIndex(), RT_TEXCOORD ); 191 var->setName( "tc" + element.getSemantic() ); 192 } 193 194 if ( !var ) 195 continue; 196 197 var->setStructName( "IN" ); 198 var->setType( typeToString( element.getType() ) ); 199 } 200 201 return vertComp; 202} 203 204ShaderComponent* ShaderGenComponentFactoryHLSL::createVertexPixelConnector() 205{ 206 ShaderComponent* comp = new ShaderConnectorHLSL; 207 ((ShaderConnector*)comp)->setName("ConnectData"); 208 return comp; 209} 210 211ShaderComponent* ShaderGenComponentFactoryHLSL::createVertexParamsDef() 212{ 213 ShaderComponent* comp = new VertexParamsDefHLSL; 214 return comp; 215} 216 217ShaderComponent* ShaderGenComponentFactoryHLSL::createPixelParamsDef() 218{ 219 ShaderComponent* comp = new PixelParamsDefHLSL; 220 return comp; 221} 222