1 /* 2 Copyright (c) 2008-2009 NetAllied Systems GmbH 3 4 This file is part of COLLADAStreamWriter. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "COLLADAFWStableHeaders.h" 12 #include "COLLADAFWRenderState.h" 13 #include "COLLADAFWRenderStateStatic.h" 14 15 #include "COLLADAFWConstants.h" 16 17 18 namespace COLLADAFW 19 { 20 21 // ------------------------------- getRenderStateFromCgName(const char * cgName)22 const RenderState::PassState RenderState::getRenderStateFromCgName ( const char* cgName ) 23 { 24 // sanity checks 25 if (cgName == NULL || cgName[0] == '\0') return RenderState::PASS_STATE_INVALID; 26 27 const size_t arrayLength = getTotalRenderStateCount(); 28 29 // skip to interesting part of the array 30 size_t i = 0; 31 while ( i<arrayLength && tolower(CG_RENDER_STATE_NAMES[i][0]) != tolower(cgName[0]) ) i++; 32 33 // try to match the string (not case sensitive) 34 for ( ; i<arrayLength && tolower(CG_RENDER_STATE_NAMES[i][0]) == tolower(cgName[0]); i++ ) 35 { 36 if ( COLLADABU::Utils::equals ( CG_RENDER_STATE_NAMES[i], cgName ) ) 37 return CG_RENDER_STATES_XREF[i]; 38 } 39 40 // past the interesting part, we didn't find it. 41 return RenderState::PASS_STATE_INVALID; 42 } 43 44 // ------------------------------- getCgRenderStateName(const PassState & state)45 const String RenderState::getCgRenderStateName ( const PassState& state ) 46 { 47 size_t len = getTotalRenderStateCount(); 48 for ( size_t i = 0; i < len; i++ ) 49 { 50 if (CG_RENDER_STATES_XREF[i] == state) 51 return CG_RENDER_STATE_NAMES[i]; 52 } 53 return NULL; 54 } 55 56 // ------------------------------- getTotalRenderStateCount()57 size_t RenderState::getTotalRenderStateCount () 58 { 59 return sizeof ( CG_RENDER_STATE_NAMES ) / sizeof ( *CG_RENDER_STATE_NAMES ); 60 } 61 62 // ------------------------------- getPassStateFunction(const char * val)63 const RenderState::PassStateFunction RenderState::getPassStateFunction ( const char* val ) 64 { 65 if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_NEVER ) ) return PASS_STATE_FN_NEVER; 66 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_LESS ) ) return PASS_STATE_FN_LESS; 67 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_EQUAL ) ) return PASS_STATE_FN_EQUAL; 68 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_LEQUAL ) ) return PASS_STATE_FN_LESS_EQUAL; 69 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_GREATER ) ) return PASS_STATE_FN_GREATER; 70 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_NEQUAL ) ) return PASS_STATE_FN_NOT_EQUAL; 71 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_GEQUAL ) ) return PASS_STATE_FN_GREATER_EQUAL; 72 else if ( COLLADABU::Utils::equalsIgnoreCase ( val, Constants::FX_FUNCTION_ALWAYS ) ) return PASS_STATE_FN_ALWAYS; 73 else return PASS_STATE_FN_INVALID; 74 } 75 76 // ------------------------------- getColladaPassStateString(const PassStateFunction & fn)77 const String& RenderState::getColladaPassStateString ( const PassStateFunction& fn ) 78 { 79 switch (fn) 80 { 81 case PASS_STATE_FN_NEVER: return Constants::FX_FUNCTION_NEVER; 82 case PASS_STATE_FN_LESS: return Constants::FX_FUNCTION_LESS; 83 case PASS_STATE_FN_EQUAL: return Constants::FX_FUNCTION_EQUAL; 84 case PASS_STATE_FN_LESS_EQUAL: return Constants::FX_FUNCTION_LEQUAL; 85 case PASS_STATE_FN_GREATER: return Constants::FX_FUNCTION_GREATER; 86 case PASS_STATE_FN_NOT_EQUAL: return Constants::FX_FUNCTION_NEQUAL; 87 case PASS_STATE_FN_GREATER_EQUAL: return Constants::FX_FUNCTION_GEQUAL; 88 case PASS_STATE_FN_ALWAYS: return Constants::FX_FUNCTION_ALWAYS; 89 case PASS_STATE_FN_INVALID: 90 default: return Constants::ERR_UNKNOWN_INPUT; 91 } 92 } 93 94 // ------------------------------- getColladaRenderStateName(const PassState & state)95 const String& RenderState::getColladaRenderStateName ( const PassState& state ) 96 { 97 switch (state) 98 { 99 case ALPHA_FUNC: return Constants::FX_STATE_ALPHA_FUNC; 100 case BLEND_FUNC: return Constants::FX_STATE_BLEND_FUNC; 101 case BLEND_FUNC_SEPARATE: return Constants::FX_STATE_BLEND_FUNC_SEPARATE; 102 case BLEND_EQUATION: return Constants::FX_STATE_BLEND_EQUATION; 103 case BLEND_EQUATION_SEPARATE: return Constants::FX_STATE_BLEND_EQUATION_SEPARATE; 104 case COLOR_MATERIAL: return Constants::FX_STATE_COLOR_MATERIAL; 105 case CULL_FACE: return Constants::FX_STATE_CULL_FACE; 106 case DEPTH_FUNC: return Constants::FX_STATE_DEPTH_FUNC; 107 case FOG_MODE: return Constants::FX_STATE_FOG_MODE; 108 case FOG_COORD_SRC: return Constants::FX_STATE_FOG_COORD_SRC; 109 case FRONT_FACE: return Constants::FX_STATE_FRONT_FACE; 110 case LIGHT_MODEL_COLOR_CONTROL: return Constants::FX_STATE_LIGHT_MODEL_COLOR_CONTROL; 111 case LOGIC_OP: return Constants::FX_STATE_LOGIC_OP; 112 case POLYGON_MODE: return Constants::FX_STATE_POLYGON_MODE; 113 case SHADE_MODEL: return Constants::FX_STATE_SHADE_MODEL; 114 case STENCIL_FUNC: return Constants::FX_STATE_STENCIL_FUNC; 115 case STENCIL_OP: return Constants::FX_STATE_STENCIL_OP; 116 case STENCIL_FUNC_SEPARATE: return Constants::FX_STATE_STENCIL_FUNC_SEPARATE; 117 case STENCIL_OP_SEPARATE: return Constants::FX_STATE_STENCIL_OP_SEPARATE; 118 case STENCIL_MASK_SEPARATE: return Constants::FX_STATE_STENCIL_MASK_SEPARATE; 119 case LIGHT_ENABLE: return Constants::FX_STATE_LIGHT_ENABLE; 120 case LIGHT_AMBIENT: return Constants::FX_STATE_LIGHT_AMBIENT; 121 case LIGHT_DIFFUSE: return Constants::FX_STATE_LIGHT_DIFFUSE; 122 case LIGHT_SPECULAR: return Constants::FX_STATE_LIGHT_SPECULAR; 123 case LIGHT_POSITION: return Constants::FX_STATE_LIGHT_POSITION; 124 case LIGHT_CONSTANT_ATTENUATION: return Constants::FX_STATE_LIGHT_CONSTANT_ATTENUATION; 125 case LIGHT_LINEAR_ATTENUATION: return Constants::FX_STATE_LIGHT_LINEAR_ATTENUATION; 126 case LIGHT_QUADRATIC_ATTENUATION: return Constants::FX_STATE_LIGHT_QUADRATIC_ATTENUATION; 127 case LIGHT_SPOT_CUTOFF: return Constants::FX_STATE_LIGHT_SPOT_CUTOFF; 128 case LIGHT_SPOT_DIRECTION: return Constants::FX_STATE_LIGHT_SPOT_DIRECTION; 129 case LIGHT_SPOT_EXPONENT: return Constants::FX_STATE_LIGHT_SPOT_EXPONENT; 130 case TEXTURE1D: return Constants::FX_STATE_TEXTURE1D; 131 case TEXTURE2D: return Constants::FX_STATE_TEXTURE2D; 132 case TEXTURE3D: return Constants::FX_STATE_TEXTURE3D; 133 case TEXTURECUBE: return Constants::FX_STATE_TEXTURECUBE; 134 case TEXTURERECT: return Constants::FX_STATE_TEXTURERECT; 135 case TEXTUREDEPTH: return Constants::FX_STATE_TEXTUREDEPTH; 136 case TEXTURE1D_ENABLE: return Constants::FX_STATE_TEXTURE1D_ENABLE; 137 case TEXTURE2D_ENABLE: return Constants::FX_STATE_TEXTURE2D_ENABLE; 138 case TEXTURE3D_ENABLE: return Constants::FX_STATE_TEXTURE3D_ENABLE; 139 case TEXTURECUBE_ENABLE: return Constants::FX_STATE_TEXTURECUBE_ENABLE; 140 case TEXTURERECT_ENABLE: return Constants::FX_STATE_TEXTURERECT_ENABLE; 141 case TEXTUREDEPTH_ENABLE: return Constants::FX_STATE_TEXTUREDEPTH_ENABLE; 142 case TEXTURE_ENV_COLOR: return Constants::FX_STATE_TEXTURE_ENV_COLOR; 143 case TEXTURE_ENV_MODE: return Constants::FX_STATE_TEXTURE_ENV_MODE; 144 case CLIP_PLANE: return Constants::FX_STATE_CLIP_PLANE; 145 case CLIP_PLANE_ENABLE: return Constants::FX_STATE_CLIP_PLANE_ENABLE; 146 case BLEND_COLOR: return Constants::FX_STATE_BLEND_COLOR; 147 case CLEAR_COLOR: return Constants::FX_STATE_CLEAR_COLOR; 148 case CLEAR_STENCIL: return Constants::FX_STATE_CLEAR_STENCIL; 149 case CLEAR_DEPTH: return Constants::FX_STATE_CLEAR_DEPTH; 150 case COLOR_MASK: return Constants::FX_STATE_COLOR_MASK; 151 case DEPTH_BOUNDS: return Constants::FX_STATE_DEPTH_BOUNDS; 152 case DEPTH_MASK: return Constants::FX_STATE_DEPTH_MASK; 153 case DEPTH_RANGE: return Constants::FX_STATE_DEPTH_RANGE; 154 case FOG_DENSITY: return Constants::FX_STATE_FOG_DENSITY; 155 case FOG_START: return Constants::FX_STATE_FOG_START; 156 case FOG_END: return Constants::FX_STATE_FOG_END; 157 case FOG_COLOR: return Constants::FX_STATE_FOG_COLOR; 158 case LIGHT_MODEL_AMBIENT: return Constants::FX_STATE_LIGHT_MODEL_AMBIENT; 159 case LIGHTING_ENABLE: return Constants::FX_STATE_LIGHTING_ENABLE; 160 case LINE_STIPPLE: return Constants::FX_STATE_LINE_STIPPLE; 161 case LINE_WIDTH: return Constants::FX_STATE_LINE_WIDTH; 162 case MATERIAL_AMBIENT: return Constants::FX_STATE_MATERIAL_AMBIENT; 163 case MATERIAL_DIFFUSE: return Constants::FX_STATE_MATERIAL_DIFFUSE; 164 case MATERIAL_EMISSION: return Constants::FX_STATE_MATERIAL_EMISSION; 165 case MATERIAL_SHININESS: return Constants::FX_STATE_MATERIAL_SHININESS; 166 case MATERIAL_SPECULAR: return Constants::FX_STATE_MATERIAL_SPECULAR; 167 case MODEL_VIEW_MATRIX: return Constants::FX_STATE_MODEL_VIEW_MATRIX; 168 case POINT_DISTANCE_ATTENUATION: return Constants::FX_STATE_POINT_DISTANCE_ATTENUATION; 169 case POINT_FADE_THRESHOLD_SIZE: return Constants::FX_STATE_POINT_FADE_THRESHOLD_SIZE; 170 case POINT_SIZE: return Constants::FX_STATE_POINT_SIZE; 171 case POINT_SIZE_MIN: return Constants::FX_STATE_POINT_SIZE_MIN; 172 case POINT_SIZE_MAX: return Constants::FX_STATE_POINT_SIZE_MAX; 173 case POLYGON_OFFSET: return Constants::FX_STATE_POLYGON_OFFSET; 174 case PROJECTION_MATRIX: return Constants::FX_STATE_PROJECTION_MATRIX; 175 case SCISSOR: return Constants::FX_STATE_SCISSOR; 176 case STENCIL_MASK: return Constants::FX_STATE_STENCIL_MASK; 177 case ALPHA_TEST_ENABLE: return Constants::FX_STATE_ALPHA_TEST_ENABLE; 178 case AUTO_NORMAL_ENABLE: return Constants::FX_STATE_AUTO_NORMAL_ENABLE; 179 case BLEND_ENABLE: return Constants::FX_STATE_BLEND_ENABLE; 180 case COLOR_LOGIC_OP_ENABLE: return Constants::FX_STATE_COLOR_LOGIC_OP_ENABLE; 181 case COLOR_MATERIAL_ENABLE: return Constants::FX_STATE_COLOR_MATERIAL_ENABLE; 182 case CULL_FACE_ENABLE: return Constants::FX_STATE_CULL_FACE_ENABLE; 183 case DEPTH_BOUNDS_ENABLE: return Constants::FX_STATE_DEPTH_BOUNDS_ENABLE; 184 case DEPTH_CLAMP_ENABLE: return Constants::FX_STATE_DEPTH_CLAMP_ENABLE; 185 case DEPTH_TEST_ENABLE: return Constants::FX_STATE_DEPTH_TEST_ENABLE; 186 case DITHER_ENABLE: return Constants::FX_STATE_DITHER_ENABLE; 187 case FOG_ENABLE: return Constants::FX_STATE_FOG_ENABLE; 188 case LIGHT_MODEL_LOCAL_VIEWER_ENABLE: return Constants::FX_STATE_LIGHT_MODEL_LOCAL_VIEWER_ENABLE; 189 case LIGHT_MODEL_TWO_SIDE_ENABLE: return Constants::FX_STATE_LIGHT_MODEL_TWO_SIDE_ENABLE; 190 case LINE_SMOOTH_ENABLE: return Constants::FX_STATE_LINE_SMOOTH_ENABLE; 191 case LINE_STIPPLE_ENABLE: return Constants::FX_STATE_LINE_STIPPLE_ENABLE; 192 case LOGIC_OP_ENABLE: return Constants::FX_STATE_LOGIC_OP_ENABLE; 193 case MULTISAMPLE_ENABLE: return Constants::FX_STATE_MULTISAMPLE_ENABLE; 194 case NORMALIZE_ENABLE: return Constants::FX_STATE_NORMALIZE_ENABLE; 195 case POINT_SMOOTH_ENABLE: return Constants::FX_STATE_POINT_SMOOTH_ENABLE; 196 case POLYGON_OFFSET_FILL_ENABLE: return Constants::FX_STATE_POLYGON_OFFSET_FILL_ENABLE; 197 case POLYGON_OFFSET_LINE_ENABLE: return Constants::FX_STATE_POLYGON_OFFSET_LINE_ENABLE; 198 case POLYGON_OFFSET_POINT_ENABLE: return Constants::FX_STATE_POLYGON_OFFSET_POINT_ENABLE; 199 case POLYGON_SMOOTH_ENABLE: return Constants::FX_STATE_POLYGON_SMOOTH_ENABLE; 200 case POLYGON_STIPPLE_ENABLE: return Constants::FX_STATE_POLYGON_STIPPLE_ENABLE; 201 case RESCALE_NORMAL_ENABLE: return Constants::FX_STATE_RESCALE_NORMAL_ENABLE; 202 case SAMPLE_ALPHA_TO_COVERAGE_ENABLE: return Constants::FX_STATE_SAMPLE_ALPHA_TO_COVERAGE_ENABLE; 203 case SAMPLE_ALPHA_TO_ONE_ENABLE: return Constants::FX_STATE_SAMPLE_ALPHA_TO_ONE_ENABLE; 204 case SAMPLE_COVERAGE_ENABLE: return Constants::FX_STATE_SAMPLE_COVERAGE_ENABLE; 205 case SCISSOR_TEST_ENABLE: return Constants::FX_STATE_SCISSOR_TEST_ENABLE; 206 case STENCIL_TEST_ENABLE: return Constants::FX_STATE_STENCIL_TEST_ENABLE; 207 case PASS_STATE_INVALID: 208 default: return Constants::ERR_UNKNOWN_INPUT; 209 } 210 } 211 212 } 213