Ogre源代码浅析——脚本及其解析(七)

    ScriptCompilerManager是进行脚本解析的关键类型对象(参见:http://www.cnblogs.com/yzwalkman/archive/2012/12/30/2839013.html “脚本及其解析(一)”)。ScriptCompilerManager在其构造函数中将会创建ScriptCompiler对象实例,并将对象指针赋给其mScriptCompiler成员变量。前面所说解析过程的三个阶段即是由此mScriptCompiler对象完成的。对于ScriptCompiler来说,除了前面涉及的各函数过程外,还有两块内容值得关注。一是,如下的枚举变量定义:

  1 enum
  2     {
  3         ID_MATERIAL = 3,
  4         ID_VERTEX_PROGRAM,
  5         ID_GEOMETRY_PROGRAM,
  6         ID_FRAGMENT_PROGRAM,
  7         ID_TECHNIQUE,
  8         ID_PASS,
  9         ID_TEXTURE_UNIT,
 10         ID_VERTEX_PROGRAM_REF,
 11         ID_GEOMETRY_PROGRAM_REF,
 12         ID_FRAGMENT_PROGRAM_REF,
 13         ID_SHADOW_CASTER_VERTEX_PROGRAM_REF,
 14         ID_SHADOW_CASTER_FRAGMENT_PROGRAM_REF,
 15         ID_SHADOW_RECEIVER_VERTEX_PROGRAM_REF,
 16         ID_SHADOW_RECEIVER_FRAGMENT_PROGRAM_REF,
 17         ID_SHADOW_CASTER_MATERIAL,
 18         ID_SHADOW_RECEIVER_MATERIAL,
 19         
 20         ID_LOD_VALUES,
 21         ID_LOD_STRATEGY,
 22         ID_LOD_DISTANCES,
 23         ID_RECEIVE_SHADOWS,
 24         ID_TRANSPARENCY_CASTS_SHADOWS,
 25         ID_SET_TEXTURE_ALIAS,
 26 
 27         ID_SOURCE,
 28         ID_SYNTAX,
 29         ID_DEFAULT_PARAMS,
 30         ID_PARAM_INDEXED,
 31         ID_PARAM_NAMED,
 32         ID_PARAM_INDEXED_AUTO,
 33         ID_PARAM_NAMED_AUTO,
 34 
 35         ID_SCHEME,
 36         ID_LOD_INDEX,
 37         ID_GPU_VENDOR_RULE,
 38         ID_GPU_DEVICE_RULE,
 39         ID_INCLUDE, 
 40         ID_EXCLUDE, 
 41 
 42         ID_AMBIENT,
 43         ID_DIFFUSE,
 44         ID_SPECULAR,
 45         ID_EMISSIVE,
 46             ID_VERTEXCOLOUR,
 47         ID_SCENE_BLEND,
 48             ID_COLOUR_BLEND,
 49             ID_ONE,
 50             ID_ZERO,
 51             ID_DEST_COLOUR,
 52             ID_SRC_COLOUR,
 53             ID_ONE_MINUS_DEST_COLOUR,
 54             ID_ONE_MINUS_SRC_COLOUR,
 55             ID_DEST_ALPHA,
 56             ID_SRC_ALPHA,
 57             ID_ONE_MINUS_DEST_ALPHA,
 58             ID_ONE_MINUS_SRC_ALPHA,
 59         ID_SEPARATE_SCENE_BLEND,
 60         ID_SCENE_BLEND_OP,
 61             ID_REVERSE_SUBTRACT,
 62             ID_MIN,
 63             ID_MAX,
 64         ID_SEPARATE_SCENE_BLEND_OP,
 65         ID_DEPTH_CHECK,
 66         ID_DEPTH_WRITE,
 67         ID_DEPTH_FUNC,
 68         ID_DEPTH_BIAS,
 69         ID_ITERATION_DEPTH_BIAS,
 70             ID_ALWAYS_FAIL,
 71             ID_ALWAYS_PASS,
 72             ID_LESS_EQUAL,
 73             ID_LESS,
 74             ID_EQUAL,
 75             ID_NOT_EQUAL,
 76             ID_GREATER_EQUAL,
 77             ID_GREATER,
 78         ID_ALPHA_REJECTION,
 79         ID_ALPHA_TO_COVERAGE,
 80         ID_LIGHT_SCISSOR,
 81         ID_LIGHT_CLIP_PLANES,
 82         ID_TRANSPARENT_SORTING,
 83         ID_ILLUMINATION_STAGE,
 84             ID_DECAL,
 85         ID_CULL_HARDWARE,
 86             ID_CLOCKWISE,
 87             ID_ANTICLOCKWISE,
 88         ID_CULL_SOFTWARE,
 89             ID_BACK,
 90             ID_FRONT,
 91         ID_NORMALISE_NORMALS,
 92         ID_LIGHTING,
 93         ID_SHADING,
 94             ID_FLAT, 
 95             ID_GOURAUD,
 96             ID_PHONG,
 97         ID_POLYGON_MODE,
 98             ID_SOLID,
 99             ID_WIREFRAME,
100             ID_POINTS,
101         ID_POLYGON_MODE_OVERRIDEABLE,
102         ID_FOG_OVERRIDE,
103             ID_NONE,
104             ID_LINEAR,
105             ID_EXP,
106             ID_EXP2,
107         ID_COLOUR_WRITE,
108         ID_MAX_LIGHTS,
109         ID_START_LIGHT,
110         ID_ITERATION,
111             ID_ONCE,
112             ID_ONCE_PER_LIGHT,
113             ID_PER_LIGHT,
114             ID_PER_N_LIGHTS,
115             ID_POINT,
116             ID_SPOT,
117             ID_DIRECTIONAL,
118         ID_LIGHT_MASK,
119         ID_POINT_SIZE,
120         ID_POINT_SPRITES,
121         ID_POINT_SIZE_ATTENUATION,
122         ID_POINT_SIZE_MIN,
123         ID_POINT_SIZE_MAX,
124 
125         ID_TEXTURE_ALIAS,
126         ID_TEXTURE,
127             ID_1D,
128             ID_2D,
129             ID_3D,
130             ID_CUBIC,
131             ID_UNLIMITED,
132             ID_ALPHA,
133             ID_GAMMA,
134         ID_ANIM_TEXTURE,
135         ID_CUBIC_TEXTURE,
136             ID_SEPARATE_UV,
137             ID_COMBINED_UVW,
138         ID_TEX_COORD_SET,
139         ID_TEX_ADDRESS_MODE,
140             ID_WRAP,
141             ID_CLAMP,
142             ID_BORDER,
143             ID_MIRROR,
144         ID_TEX_BORDER_COLOUR,
145         ID_FILTERING,
146             ID_BILINEAR,
147             ID_TRILINEAR,
148             ID_ANISOTROPIC,
149         ID_MAX_ANISOTROPY,
150         ID_MIPMAP_BIAS,
151         ID_COLOUR_OP,
152             ID_REPLACE,
153             ID_ADD,
154             ID_MODULATE,
155             ID_ALPHA_BLEND,
156         ID_COLOUR_OP_EX,
157             ID_SOURCE1,
158             ID_SOURCE2,
159             ID_MODULATE_X2,
160             ID_MODULATE_X4,
161             ID_ADD_SIGNED,
162             ID_ADD_SMOOTH,
163             ID_SUBTRACT,
164             ID_BLEND_DIFFUSE_COLOUR,
165             ID_BLEND_DIFFUSE_ALPHA,
166             ID_BLEND_TEXTURE_ALPHA,
167             ID_BLEND_CURRENT_ALPHA,
168             ID_BLEND_MANUAL,
169             ID_DOT_PRODUCT,
170             ID_SRC_CURRENT,
171             ID_SRC_TEXTURE,
172             ID_SRC_DIFFUSE,
173             ID_SRC_SPECULAR,
174             ID_SRC_MANUAL,
175         ID_COLOUR_OP_MULTIPASS_FALLBACK,
176         ID_ALPHA_OP_EX,
177         ID_ENV_MAP,
178             ID_SPHERICAL,
179             ID_PLANAR,
180             ID_CUBIC_REFLECTION,
181             ID_CUBIC_NORMAL,
182         ID_SCROLL,
183         ID_SCROLL_ANIM,
184         ID_ROTATE,
185         ID_ROTATE_ANIM,
186         ID_SCALE,
187         ID_WAVE_XFORM,
188             ID_SCROLL_X,
189             ID_SCROLL_Y,
190             ID_SCALE_X,
191             ID_SCALE_Y,
192             ID_SINE,
193             ID_TRIANGLE,
194             ID_SQUARE,
195             ID_SAWTOOTH,
196             ID_INVERSE_SAWTOOTH,
197         ID_TRANSFORM,
198         ID_BINDING_TYPE,
199             ID_VERTEX,
200             ID_FRAGMENT,
201         ID_CONTENT_TYPE,
202             ID_NAMED,
203             ID_SHADOW,
204         ID_TEXTURE_SOURCE,
205         ID_SHARED_PARAMS,
206         ID_SHARED_PARAM_NAMED,
207         ID_SHARED_PARAMS_REF,
208 
209         ID_PARTICLE_SYSTEM,
210         ID_EMITTER,
211         ID_AFFECTOR,
212 
213         ID_COMPOSITOR,
214             ID_TARGET,
215             ID_TARGET_OUTPUT,
216 
217             ID_INPUT,
218                 ID_PREVIOUS,
219                 ID_TARGET_WIDTH,
220                 ID_TARGET_HEIGHT,
221                 ID_TARGET_WIDTH_SCALED,
222                 ID_TARGET_HEIGHT_SCALED,
223             ID_COMPOSITOR_LOGIC,
224             ID_TEXTURE_REF,
225             ID_SCOPE_LOCAL,
226             ID_SCOPE_CHAIN,
227             ID_SCOPE_GLOBAL,
228             ID_POOLED,
229             //ID_GAMMA, - already registered for material
230             ID_NO_FSAA,
231             ID_DEPTH_POOL,
232             ID_ONLY_INITIAL,
233             ID_VISIBILITY_MASK,
234             ID_LOD_BIAS,
235             ID_MATERIAL_SCHEME,
236             ID_SHADOWS_ENABLED,
237 
238             ID_CLEAR,
239             ID_STENCIL,
240             ID_RENDER_SCENE,
241             ID_RENDER_QUAD,
242             ID_IDENTIFIER,
243             ID_FIRST_RENDER_QUEUE,
244             ID_LAST_RENDER_QUEUE,
245             ID_QUAD_NORMALS,
246                 ID_CAMERA_FAR_CORNERS_VIEW_SPACE,
247                 ID_CAMERA_FAR_CORNERS_WORLD_SPACE,
248 
249             ID_BUFFERS,
250                 ID_COLOUR,
251                 ID_DEPTH,
252             ID_COLOUR_VALUE,
253             ID_DEPTH_VALUE,
254             ID_STENCIL_VALUE,
255 
256             ID_CHECK,
257             ID_COMP_FUNC,
258             ID_REF_VALUE,
259             ID_MASK,
260             ID_FAIL_OP,
261                 ID_KEEP,
262                 ID_INCREMENT,
263                 ID_DECREMENT,
264                 ID_INCREMENT_WRAP,
265                 ID_DECREMENT_WRAP,
266                 ID_INVERT,
267             ID_DEPTH_FAIL_OP,
268             ID_PASS_OP,
269             ID_TWO_SIDED,
270 #ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
271         ID_RT_SHADER_SYSTEM,
272 #endif
273         ID_END_BUILTIN_IDS
274     };

    此枚举变量中的各个值,对应着在Ogre脚本文件中出现的所有的关键字。 二是,ScriptCompiler相关的成员变量mIds,定义如下:

1 typedef HashMap<String,uint32> IdMap;        
2 ...
3 IdMap mIds;

    对mIds的初始化,是在ScriptCompiler类的initWordMap函数中完成的:

  1     void ScriptCompiler::initWordMap()
  2     {
  3         mIds["on"] = ID_ON;
  4         mIds["off"] = ID_OFF;
  5         mIds["true"] = ID_TRUE;
  6         mIds["false"] = ID_FALSE;
  7         mIds["yes"] = ID_YES;
  8         mIds["no"] = ID_NO;
  9 
 10         // Material ids
 11         mIds["material"] = ID_MATERIAL;
 12         mIds["vertex_program"] = ID_VERTEX_PROGRAM;
 13         mIds["geometry_program"] = ID_GEOMETRY_PROGRAM;
 14         mIds["fragment_program"] = ID_FRAGMENT_PROGRAM;
 15         mIds["technique"] = ID_TECHNIQUE;
 16         mIds["pass"] = ID_PASS;
 17         mIds["texture_unit"] = ID_TEXTURE_UNIT;
 18         mIds["vertex_program_ref"] = ID_VERTEX_PROGRAM_REF;
 19         mIds["geometry_program_ref"] = ID_GEOMETRY_PROGRAM_REF;
 20         mIds["fragment_program_ref"] = ID_FRAGMENT_PROGRAM_REF;
 21         mIds["shadow_caster_vertex_program_ref"] = ID_SHADOW_CASTER_VERTEX_PROGRAM_REF;
 22         mIds["shadow_caster_fragment_program_ref"] = ID_SHADOW_CASTER_FRAGMENT_PROGRAM_REF;
 23         mIds["shadow_receiver_vertex_program_ref"] = ID_SHADOW_RECEIVER_VERTEX_PROGRAM_REF;
 24         mIds["shadow_receiver_fragment_program_ref"] = ID_SHADOW_RECEIVER_FRAGMENT_PROGRAM_REF;
 25 
 26         mIds["lod_values"] = ID_LOD_VALUES;
 27         mIds["lod_strategy"] = ID_LOD_STRATEGY;
 28         mIds["lod_distances"] = ID_LOD_DISTANCES;
 29         mIds["receive_shadows"] = ID_RECEIVE_SHADOWS;
 30         mIds["transparency_casts_shadows"] = ID_TRANSPARENCY_CASTS_SHADOWS;
 31         mIds["set_texture_alias"] = ID_SET_TEXTURE_ALIAS;
 32 
 33         mIds["source"] = ID_SOURCE;
 34         mIds["syntax"] = ID_SYNTAX;
 35         mIds["default_params"] = ID_DEFAULT_PARAMS;
 36         mIds["param_indexed"] = ID_PARAM_INDEXED;
 37         mIds["param_named"] = ID_PARAM_NAMED;
 38         mIds["param_indexed_auto"] = ID_PARAM_INDEXED_AUTO;
 39         mIds["param_named_auto"] = ID_PARAM_NAMED_AUTO;
 40 
 41         mIds["scheme"] = ID_SCHEME;
 42         mIds["lod_index"] = ID_LOD_INDEX;
 43         mIds["shadow_caster_material"] = ID_SHADOW_CASTER_MATERIAL;
 44         mIds["shadow_receiver_material"] = ID_SHADOW_RECEIVER_MATERIAL;
 45         mIds["gpu_vendor_rule"] = ID_GPU_VENDOR_RULE;
 46         mIds["gpu_device_rule"] = ID_GPU_DEVICE_RULE;
 47         mIds["include"] = ID_INCLUDE;
 48         mIds["exclude"] = ID_EXCLUDE;
 49 
 50         mIds["ambient"] = ID_AMBIENT;
 51         mIds["diffuse"] = ID_DIFFUSE;
 52         mIds["specular"] = ID_SPECULAR;
 53         mIds["emissive"] = ID_EMISSIVE;
 54         mIds["vertexcolour"] = ID_VERTEXCOLOUR;
 55         mIds["scene_blend"] = ID_SCENE_BLEND;
 56         mIds["colour_blend"] = ID_COLOUR_BLEND;
 57         mIds["one"] = ID_ONE;
 58         mIds["zero"] = ID_ZERO;
 59         mIds["dest_colour"] = ID_DEST_COLOUR;
 60         mIds["src_colour"] = ID_SRC_COLOUR;
 61         mIds["one_minus_src_colour"] = ID_ONE_MINUS_SRC_COLOUR;
 62         mIds["one_minus_dest_colour"] = ID_ONE_MINUS_DEST_COLOUR;
 63         mIds["dest_alpha"] = ID_DEST_ALPHA;
 64         mIds["src_alpha"] = ID_SRC_ALPHA;
 65         mIds["one_minus_dest_alpha"] = ID_ONE_MINUS_DEST_ALPHA;
 66         mIds["one_minus_src_alpha"] = ID_ONE_MINUS_SRC_ALPHA;
 67         mIds["separate_scene_blend"] = ID_SEPARATE_SCENE_BLEND;
 68         mIds["scene_blend_op"] = ID_SCENE_BLEND_OP;
 69         mIds["reverse_subtract"] = ID_REVERSE_SUBTRACT;
 70         mIds["min"] = ID_MIN;
 71         mIds["max"] = ID_MAX;
 72         mIds["separate_scene_blend_op"] = ID_SEPARATE_SCENE_BLEND_OP;
 73         mIds["depth_check"] = ID_DEPTH_CHECK;
 74         mIds["depth_write"] = ID_DEPTH_WRITE;
 75         mIds["depth_func"] = ID_DEPTH_FUNC;
 76         mIds["depth_bias"] = ID_DEPTH_BIAS;
 77         mIds["iteration_depth_bias"] = ID_ITERATION_DEPTH_BIAS;
 78         mIds["always_fail"] = ID_ALWAYS_FAIL;
 79         mIds["always_pass"] = ID_ALWAYS_PASS;
 80         mIds["less_equal"] = ID_LESS_EQUAL;
 81         mIds["less"] = ID_LESS;
 82         mIds["equal"] = ID_EQUAL;
 83         mIds["not_equal"] = ID_NOT_EQUAL;
 84         mIds["greater_equal"] = ID_GREATER_EQUAL;
 85         mIds["greater"] = ID_GREATER;
 86         mIds["alpha_rejection"] = ID_ALPHA_REJECTION;
 87         mIds["alpha_to_coverage"] = ID_ALPHA_TO_COVERAGE;
 88         mIds["light_scissor"] = ID_LIGHT_SCISSOR;
 89         mIds["light_clip_planes"] = ID_LIGHT_CLIP_PLANES;
 90         mIds["transparent_sorting"] = ID_TRANSPARENT_SORTING;
 91         mIds["illumination_stage"] = ID_ILLUMINATION_STAGE;
 92         mIds["decal"] = ID_DECAL;
 93         mIds["cull_hardware"] = ID_CULL_HARDWARE;
 94         mIds["clockwise"] = ID_CLOCKWISE;
 95         mIds["anticlockwise"] = ID_ANTICLOCKWISE;
 96         mIds["cull_software"] = ID_CULL_SOFTWARE;
 97         mIds["back"] = ID_BACK;
 98         mIds["front"] = ID_FRONT;
 99         mIds["normalise_normals"] = ID_NORMALISE_NORMALS;
100         mIds["lighting"] = ID_LIGHTING;
101         mIds["shading"] = ID_SHADING;
102         mIds["flat"] = ID_FLAT;
103         mIds["gouraud"] = ID_GOURAUD;
104         mIds["phong"] = ID_PHONG;
105         mIds["polygon_mode"] = ID_POLYGON_MODE;
106         mIds["solid"] = ID_SOLID;
107         mIds["wireframe"] = ID_WIREFRAME;
108         mIds["points"] = ID_POINTS;
109         mIds["polygon_mode_overrideable"] = ID_POLYGON_MODE_OVERRIDEABLE;
110         mIds["fog_override"] = ID_FOG_OVERRIDE;
111         mIds["none"] = ID_NONE;
112         mIds["linear"] = ID_LINEAR;
113         mIds["exp"] = ID_EXP;
114         mIds["exp2"] = ID_EXP2;
115         mIds["colour_write"] = ID_COLOUR_WRITE;
116         mIds["max_lights"] = ID_MAX_LIGHTS;
117         mIds["start_light"] = ID_START_LIGHT;
118         mIds["iteration"] = ID_ITERATION;
119         mIds["once"] = ID_ONCE;
120         mIds["once_per_light"] = ID_ONCE_PER_LIGHT;
121         mIds["per_n_lights"] = ID_PER_N_LIGHTS;
122         mIds["per_light"] = ID_PER_LIGHT;
123         mIds["point"] = ID_POINT;
124         mIds["spot"] = ID_SPOT;
125         mIds["directional"] = ID_DIRECTIONAL;
126         mIds["light_mask"] = ID_LIGHT_MASK;
127         mIds["point_size"] = ID_POINT_SIZE;
128         mIds["point_sprites"] = ID_POINT_SPRITES;
129         mIds["point_size_min"] = ID_POINT_SIZE_MIN;
130         mIds["point_size_max"] = ID_POINT_SIZE_MAX;
131         mIds["point_size_attenuation"] = ID_POINT_SIZE_ATTENUATION;
132 
133         mIds["texture_alias"] = ID_TEXTURE_ALIAS;
134         mIds["texture"] = ID_TEXTURE;
135         mIds["1d"] = ID_1D;
136         mIds["2d"] = ID_2D;
137         mIds["3d"] = ID_3D;
138         mIds["cubic"] = ID_CUBIC;
139         mIds["unlimited"] = ID_UNLIMITED;
140         mIds["alpha"] = ID_ALPHA;
141         mIds["gamma"] = ID_GAMMA;
142         mIds["anim_texture"] = ID_ANIM_TEXTURE;
143         mIds["cubic_texture"] = ID_CUBIC_TEXTURE;
144         mIds["separateUV"] = ID_SEPARATE_UV;
145         mIds["combinedUVW"] = ID_COMBINED_UVW;
146         mIds["tex_coord_set"] = ID_TEX_COORD_SET;
147         mIds["tex_address_mode"] = ID_TEX_ADDRESS_MODE;
148         mIds["wrap"] = ID_WRAP;
149         mIds["clamp"] = ID_CLAMP;
150         mIds["mirror"] = ID_MIRROR;
151         mIds["border"] = ID_BORDER;
152         mIds["tex_border_colour"] = ID_TEX_BORDER_COLOUR;
153         mIds["filtering"] = ID_FILTERING;
154         mIds["bilinear"] = ID_BILINEAR;
155         mIds["trilinear"] = ID_TRILINEAR;
156         mIds["anisotropic"] = ID_ANISOTROPIC;
157         mIds["max_anisotropy"] = ID_MAX_ANISOTROPY;
158         mIds["mipmap_bias"] = ID_MIPMAP_BIAS;
159         mIds["colour_op"] = ID_COLOUR_OP;
160         mIds["replace"] = ID_REPLACE;
161         mIds["add"] = ID_ADD;
162         mIds["modulate"] = ID_MODULATE;
163         mIds["alpha_blend"] = ID_ALPHA_BLEND;
164         mIds["colour_op_ex"] = ID_COLOUR_OP_EX;
165         mIds["source1"] = ID_SOURCE1;
166         mIds["source2"] = ID_SOURCE2;
167         mIds["modulate"] = ID_MODULATE;
168         mIds["modulate_x2"] = ID_MODULATE_X2;
169         mIds["modulate_x4"] = ID_MODULATE_X4;
170         mIds["add"] = ID_ADD;
171         mIds["add_signed"] = ID_ADD_SIGNED;
172         mIds["add_smooth"] = ID_ADD_SMOOTH;
173         mIds["subtract"] = ID_SUBTRACT;
174         mIds["blend_diffuse_alpha"] = ID_BLEND_DIFFUSE_ALPHA;
175         mIds["blend_texture_alpha"] = ID_BLEND_TEXTURE_ALPHA;
176         mIds["blend_current_alpha"] = ID_BLEND_CURRENT_ALPHA;
177         mIds["blend_manual"] = ID_BLEND_MANUAL;
178         mIds["dotproduct"] = ID_DOT_PRODUCT;
179         mIds["blend_diffuse_colour"] = ID_BLEND_DIFFUSE_COLOUR;
180         mIds["src_current"] = ID_SRC_CURRENT;
181         mIds["src_texture"] = ID_SRC_TEXTURE;
182         mIds["src_diffuse"] = ID_SRC_DIFFUSE;
183         mIds["src_specular"] = ID_SRC_SPECULAR;
184         mIds["src_manual"] = ID_SRC_MANUAL;
185         mIds["colour_op_multipass_fallback"] = ID_COLOUR_OP_MULTIPASS_FALLBACK;
186         mIds["alpha_op_ex"] = ID_ALPHA_OP_EX;
187         mIds["env_map"] = ID_ENV_MAP;
188         mIds["spherical"] = ID_SPHERICAL;
189         mIds["planar"] = ID_PLANAR;
190         mIds["cubic_reflection"] = ID_CUBIC_REFLECTION;
191         mIds["cubic_normal"] = ID_CUBIC_NORMAL;
192         mIds["scroll"] = ID_SCROLL;
193         mIds["scroll_anim"] = ID_SCROLL_ANIM;
194         mIds["rotate"] = ID_ROTATE;
195         mIds["rotate_anim"] = ID_ROTATE_ANIM;
196         mIds["scale"] = ID_SCALE;
197         mIds["wave_xform"] = ID_WAVE_XFORM;
198         mIds["scroll_x"] = ID_SCROLL_X;
199         mIds["scroll_y"] = ID_SCROLL_Y;
200         mIds["scale_x"] = ID_SCALE_X;
201         mIds["scale_y"] = ID_SCALE_Y;
202         mIds["sine"] = ID_SINE;
203         mIds["triangle"] = ID_TRIANGLE;
204         mIds["sawtooth"] = ID_SAWTOOTH;
205         mIds["square"] = ID_SQUARE;
206         mIds["inverse_sawtooth"] = ID_INVERSE_SAWTOOTH;
207         mIds["transform"] = ID_TRANSFORM;
208         mIds["binding_type"] = ID_BINDING_TYPE;
209         mIds["vertex"] = ID_VERTEX;
210         mIds["fragment"] = ID_FRAGMENT;
211         mIds["content_type"] = ID_CONTENT_TYPE;
212         mIds["named"] = ID_NAMED;
213         mIds["shadow"] = ID_SHADOW;
214         mIds["texture_source"] = ID_TEXTURE_SOURCE;
215         mIds["shared_params"] = ID_SHARED_PARAMS;
216         mIds["shared_param_named"] = ID_SHARED_PARAM_NAMED;
217         mIds["shared_params_ref"] = ID_SHARED_PARAMS_REF;
218 
219         // Particle system
220         mIds["particle_system"] = ID_PARTICLE_SYSTEM;
221         mIds["emitter"] = ID_EMITTER;
222         mIds["affector"] = ID_AFFECTOR;
223 
224         // Compositor
225         mIds["compositor"] = ID_COMPOSITOR;
226         mIds["target"] = ID_TARGET;
227         mIds["target_output"] = ID_TARGET_OUTPUT;
228 
229         mIds["input"] = ID_INPUT;
230         mIds["none"] = ID_NONE;
231         mIds["previous"] = ID_PREVIOUS;
232         mIds["target_width"] = ID_TARGET_WIDTH;
233         mIds["target_height"] = ID_TARGET_HEIGHT;
234         mIds["target_width_scaled"] = ID_TARGET_WIDTH_SCALED;
235         mIds["target_height_scaled"] = ID_TARGET_HEIGHT_SCALED;
236         mIds["pooled"] = ID_POOLED;
237         //mIds["gamma"] = ID_GAMMA; - already registered
238         mIds["no_fsaa"] = ID_NO_FSAA;
239         mIds["depth_pool"] = ID_DEPTH_POOL;
240 
241         mIds["texture_ref"] = ID_TEXTURE_REF;
242         mIds["local_scope"] = ID_SCOPE_LOCAL;
243         mIds["chain_scope"] = ID_SCOPE_CHAIN;
244         mIds["global_scope"] = ID_SCOPE_GLOBAL;
245         mIds["compositor_logic"] = ID_COMPOSITOR_LOGIC;
246             
247         mIds["only_initial"] = ID_ONLY_INITIAL;
248         mIds["visibility_mask"] = ID_VISIBILITY_MASK;
249         mIds["lod_bias"] = ID_LOD_BIAS;
250         mIds["material_scheme"] = ID_MATERIAL_SCHEME;
251         mIds["shadows"] = ID_SHADOWS_ENABLED;
252 
253         mIds["clear"] = ID_CLEAR;
254         mIds["stencil"] = ID_STENCIL;
255         mIds["render_scene"] = ID_RENDER_SCENE;
256         mIds["render_quad"] = ID_RENDER_QUAD;
257         mIds["identifier"] = ID_IDENTIFIER;
258         mIds["first_render_queue"] = ID_FIRST_RENDER_QUEUE;
259         mIds["last_render_queue"] = ID_LAST_RENDER_QUEUE;
260         mIds["quad_normals"] = ID_QUAD_NORMALS;
261         mIds["camera_far_corners_view_space"] = ID_CAMERA_FAR_CORNERS_VIEW_SPACE;
262         mIds["camera_far_corners_world_space"] = ID_CAMERA_FAR_CORNERS_WORLD_SPACE;
263 
264         mIds["buffers"] = ID_BUFFERS;
265         mIds["colour"] = ID_COLOUR;
266         mIds["depth"] = ID_DEPTH;
267         mIds["colour_value"] = ID_COLOUR_VALUE;
268         mIds["depth_value"] = ID_DEPTH_VALUE;
269         mIds["stencil_value"] = ID_STENCIL_VALUE;
270 
271         mIds["check"] = ID_CHECK;
272         mIds["comp_func"] = ID_COMP_FUNC;
273         mIds["ref_value"] = ID_REF_VALUE;
274         mIds["mask"] = ID_MASK;
275         mIds["fail_op"] = ID_FAIL_OP;
276         mIds["keep"] = ID_KEEP;
277         mIds["increment"] = ID_INCREMENT;
278         mIds["decrement"] = ID_DECREMENT;
279         mIds["increment_wrap"] = ID_INCREMENT_WRAP;
280         mIds["decrement_wrap"] = ID_DECREMENT_WRAP;
281         mIds["invert"] = ID_INVERT;
282         mIds["depth_fail_op"] = ID_DEPTH_FAIL_OP;
283         mIds["pass_op"] = ID_PASS_OP;
284         mIds["two_sided"] = ID_TWO_SIDED;
285 #ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
286         mIds["rtshader_system"] = ID_RT_SHADER_SYSTEM;
287 #endif
288     }

    可以看到,mIds容器主要用于将脚本文件中的关键字映射到相关的枚举变量上,并保存这种对应关系。

    脚本文件的解析,在完成了之前的三个阶段后,Ogre将会根据解析所得的脚本文件类型和结构来创建脚本数据对象,读取相应的脚本数据。为此,Ogre还引入了ScriptTranslator类型,并定义了以下类型MaterialTranslator、TechniqueTranslator、PassTranslator、TextureUnitTranslator、TextureSourceTranslator、GpuProgramTranslator、SharedParamsTranslator、ParticleSystemTranslator、ParticleEmitterTranslator、ParticleAffectorTranslator、CompositorTranslator、CompositionTechniqueTranslator、CompositionTargetPassTranslator和CompositionPassTranslator作为ScriptTranslator类的派生类。这些ScriptTranslator类对象实例由ScriptTranslatorManager来管理。ScriptTranslatorManager作为ScriptCompilerManager的成员变量被保存,其在ScriptCompilerManager中相应的成员变量的定义为:

1         // Stores a map from object types to the translators that handle them
2         vector<ScriptTranslatorManager*>::type mManagers;
3 
4         // A pointer to the built-in ScriptTranslatorManager
5         ScriptTranslatorManager *mBuiltinTranslatorManager;

    Ogre并不是直接对ScriptTranslatorManager进行实例化并加以保存;而是以ScriptTranslatorManager为基类,定义一个派生类——BuiltinScriptTranslatorManager,然后将创建的BuiltinScriptTranslatorManager的对象指针保存在ScriptCompilerManager中,BuiltinScriptTranslatorManager定义如下:

 1     class _OgreExport BuiltinScriptTranslatorManager : public ScriptTranslatorManager
 2     {
 3     private:
 4         MaterialTranslator mMaterialTranslator;
 5         TechniqueTranslator mTechniqueTranslator;
 6         PassTranslator mPassTranslator;
 7         TextureUnitTranslator mTextureUnitTranslator;
 8         TextureSourceTranslator mTextureSourceTranslator;
 9         GpuProgramTranslator mGpuProgramTranslator;
10         SharedParamsTranslator mSharedParamsTranslator;
11         ParticleSystemTranslator mParticleSystemTranslator;
12         ParticleEmitterTranslator mParticleEmitterTranslator;
13         ParticleAffectorTranslator mParticleAffectorTranslator;
14         CompositorTranslator mCompositorTranslator;
15         CompositionTechniqueTranslator mCompositionTechniqueTranslator;
16         CompositionTargetPassTranslator mCompositionTargetPassTranslator;
17         CompositionPassTranslator mCompositionPassTranslator;
18     public:
19         BuiltinScriptTranslatorManager();
20         /// Returns the number of translators being managed
21         virtual size_t getNumTranslators() const;
22         /// Returns a manager for the given object abstract node, or null if it is not supported
23         virtual ScriptTranslator *getTranslator(const AbstractNodePtr &node);
24     };

    可以看到,BuiltinScriptTranslatorManager一旦被创建,之前所说的各ScriptTranslator派生类对象将被自动创建。通过BuiltinScriptTranslatorManager就可以方便地引用当前需要的ScriptTranslator对象来对脚本数据进行解读。

    ScriptCompilerManager在其构造函数中创建ScriptCompiler对象实例之后,紧接着会创建BuiltinScriptTranslatorManager对象实例,并将对象指针保存在mBuiltinTranslatorManager中,同时在mManagers容器内作一个备份。

    通过ScriptCompiler实例对象和BuiltinScriptTranslatorManager实例对象的创建,ScriptCompilerManager为保存在脚本对象中的脚本数据的解析,作好了准备。

作者:yzwalkman
转载请注明出处。
原文地址:https://www.cnblogs.com/yzwalkman/p/2867793.html