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 "csextern.h"
00023 
00024 #include "csutil/strhash.h"
00025 #include "csgeom/vector4.h"
00026 #include "csutil/array.h"
00027 
00028 struct iObjectRegistry;
00029 class csShaderVariable;
00030 struct iShaderVariableContext;
00031 struct iStringSet;
00032 struct iDocumentNode;
00033 struct cons;
00034 
00038 class CS_CSGFX_EXPORT csShaderExpression 
00039 {
00040 public:
00041   struct oper_arg 
00042   { 
00043     uint8 type;
00044     
00045     union 
00046     {
00047       float num;
00048       csStringID var;
00049       
00050       // Illegal outside of a cons cell
00051       int oper;
00052       cons * cell;
00053 
00054       // Special internal values
00055       int acc;
00056     };
00057     
00058     csVector4 vec4;
00059   };
00060 
00061   struct oper 
00062   {
00063     uint8 opcode, acc;
00064     oper_arg arg1, arg2;
00065   };
00066 
00067   typedef csArray<oper> oper_array;
00068   typedef csArray<oper_arg> arg_array;
00069 
00070 private:
00071   iObjectRegistry * obj_reg;
00073   static bool loaded;
00075   static csStringHash xmltokens;
00076   static csStringHash sexptokens;
00077   static csStringHash xmltypes;
00078   static csStringHash mnemonics;
00080   iShaderVariableContext * varContext;
00082   csRef<iStringSet> strset;
00084   oper_array opcodes;
00086   int accstack_max;
00088 
00092   arg_array accstack;
00093 
00095   bool parse_xml(cons *, iDocumentNode *);
00097   bool parse_xml_atom(oper_arg &, csStringID, const char *, const char *);
00099   bool parse_sexp(cons *, iDocumentNode *);
00102   bool parse_sexp_form(const char *& text, cons *);
00104   bool parse_sexp_atom(const char *& text, cons *);
00105 
00107   bool compile_cons(const cons *, int & acc_top);
00109   bool compile_make_vector(const cons *, int & acc_top, int acc);
00110 
00112   bool eval_const(cons *&);
00113 
00115   bool eval_oper(int oper, oper_arg arg1, oper_arg arg2, oper_arg & output);
00117   bool eval_oper(int oper, oper_arg arg1, oper_arg & output);
00119   bool eval_oper(int oper, oper_arg & output);
00120 
00122   bool eval_add(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00124   bool eval_sub(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00126   bool eval_mul(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00128   bool eval_div(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00129   
00131   bool eval_elt1(const oper_arg & arg1, oper_arg & output) const;
00133   bool eval_elt2(const oper_arg & arg1, oper_arg & output) const;
00135   bool eval_elt3(const oper_arg & arg1, oper_arg & output) const;
00137   bool eval_elt4(const oper_arg & arg1, oper_arg & output) const;
00138 
00140   bool eval_sin(const oper_arg & arg1, oper_arg & output) const;
00142   bool eval_cos(const oper_arg & arg1, oper_arg & output) const;
00144   bool eval_tan(const oper_arg & arg1, oper_arg & output) const;
00145   bool eval_dot(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00146   bool eval_cross(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00147   bool eval_vec_len(const oper_arg & arg1, oper_arg & output) const;
00148   bool eval_normal(const oper_arg & arg1, oper_arg & output) const;
00149 
00150   bool eval_pow(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00151   bool eval_min(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00152   bool eval_max(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00153 
00155   bool eval_time(oper_arg & output) const;
00157   bool eval_frame(oper_arg & output) const;
00158 
00160   bool eval_selt12(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00162   bool eval_selt34(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00164   bool eval_load(const oper_arg & arg1, oper_arg & output) const;
00165 
00167   bool eval_variable(csShaderVariable *, oper_arg & out);
00169   bool eval_argument(const oper_arg &, csShaderVariable *);
00170 
00172   void destruct_cons(cons *) const;
00174   void print_cons(const cons *) const;
00176   void print_ops(const oper_array &) const;
00177 
00178   inline const char * get_type_name(csStringID) const;
00179 
00180 public:
00181   csShaderExpression(iObjectRegistry *);
00182   ~csShaderExpression();
00183 
00185   bool Parse(iDocumentNode *, iShaderVariableContext *);
00187 
00190   bool Evaluate(csShaderVariable *);
00191 };
00192 
00193 inline const char * csShaderExpression::get_type_name(csStringID id) const 
00194 {
00195   return xmltypes.Request(id);
00196 }
00197 
00198 #endif

Generated for Crystal Space by doxygen 1.2.18