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