CrystalSpace

Public API Reference

Main Page   Modules   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

csgfx/shaderexp.h

00001 /*
00002     Copyright (C) 2003 by Andrew Topp <designa@users.sourceforge.net>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public
00015     License along with this library; if not, write to the Free
00016     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 */
00018 
00019 #ifndef __CS_GFX_SHADEREXP_H__
00020 #define __CS_GFX_SHADEREXP_H__
00021 
00022 #include "csutil/strhash.h"
00023 #include "csgeom/vector4.h"
00024 #include "csutil/array.h"
00025 
00026 struct iObjectRegistry;
00027 class csShaderVariable;
00028 struct iShaderVariableContext;
00029 struct iStringSet;
00030 struct iDocumentNode;
00031 struct cons;
00032 
00036 class csShaderExpression {
00037 public:
00038   struct oper_arg { 
00039     uint8 type;
00040     
00041     union {
00042       float num;
00043       csStringID var;
00044       
00045       // Illegal outside of a cons cell
00046       int oper;
00047       cons * cell;
00048 
00049       // Special internal values
00050       int acc;
00051     };
00052     
00053     csVector4 vec4;
00054   };
00055 
00056   struct oper {
00057     uint8 opcode, acc;
00058     oper_arg arg1, arg2;
00059   };
00060 
00061   typedef csArray<oper> oper_array;
00062   typedef csArray<oper_arg> arg_array;
00063 
00064 private:
00065   iObjectRegistry * obj_reg;
00067   static bool loaded;
00069   static csStringHash xmltokens, sexptokens, xmltypes, mnemonics;
00071   iShaderVariableContext * varContext;
00073   csRef<iStringSet> strset;
00075   oper_array opcodes;
00077   int accstack_max;
00079 
00083   arg_array accstack;
00084 
00086   bool parse_xml(cons *, iDocumentNode *);
00088   bool parse_xml_atom(oper_arg &, csStringID, const char *, const char *);
00090   bool parse_sexp(cons *, iDocumentNode *);
00091 
00093   bool compile_cons(const cons *, int & acc_top);
00095   bool compile_make_vector(const cons *, int & acc_top, int acc);
00096 
00098   bool eval_const(cons *&);
00099 
00101   bool eval_oper(int oper, oper_arg arg1, oper_arg arg2, oper_arg & output);
00103   bool eval_oper(int oper, oper_arg arg1, oper_arg & output);
00105   bool eval_oper(int oper, oper_arg & output);
00106 
00108   bool eval_add(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00110   bool eval_sub(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00112   bool eval_mul(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00114   bool eval_div(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00115   
00117   bool eval_elt1(const oper_arg & arg1, oper_arg & output) const;
00119   bool eval_elt2(const oper_arg & arg1, oper_arg & output) const;
00121   bool eval_elt3(const oper_arg & arg1, oper_arg & output) const;
00123   bool eval_elt4(const oper_arg & arg1, oper_arg & output) const;
00124 
00126   bool eval_sin(const oper_arg & arg1, oper_arg & output) const;
00128   bool eval_cos(const oper_arg & arg1, oper_arg & output) const;
00130   bool eval_tan(const oper_arg & arg1, oper_arg & output) const;
00131   bool eval_dot(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00132   bool eval_cross(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00133   bool eval_vec_len(const oper_arg & arg1, oper_arg & output) const;
00134   bool eval_normal(const oper_arg & arg1, oper_arg & output) const;
00135 
00137   bool eval_time(oper_arg & output) const;
00139   bool eval_frame(oper_arg & output) const;
00140 
00142   bool eval_selt12(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00144   bool eval_selt34(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00146   bool eval_load(const oper_arg & arg1, oper_arg & output) const;
00147 
00149   bool eval_variable(csShaderVariable *, oper_arg & out);
00151   bool eval_argument(const oper_arg &, csShaderVariable *);
00152 
00154   void destruct_cons(cons *) const;
00156   void print_cons(const cons *) const;
00158   void print_ops(const oper_array &) const;
00159 
00160   inline const char * get_type_name(csStringID) const;
00161 
00162 public:
00163   csShaderExpression(iObjectRegistry *);
00164   ~csShaderExpression();
00165 
00167   bool Parse(iDocumentNode *, iShaderVariableContext *);
00169 
00172   bool Evaluate(csShaderVariable *);
00173 };
00174 
00175 inline const char * csShaderExpression::get_type_name(csStringID id) const {
00176   return xmltypes.Request(id);
00177 }
00178 
00179 #endif

Generated for Crystal Space by doxygen 1.2.18