CrystalSpace

Public API Reference

Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

shaderexp.h

Go to the documentation of this file.
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 
00026 #include "csextern.h"
00027 
00028 #include "csutil/strhash.h"
00029 #include "csutil/array.h"
00030 #include "csutil/leakguard.h"
00031 #include "csgeom/vector4.h"
00032 
00033 struct iObjectRegistry;
00034 class csShaderVariable;
00035 struct iShaderVariableContext;
00036 struct iStringSet;
00037 struct iDocumentNode;
00038 struct cons;
00039 
00043 class CS_CRYSTALSPACE_EXPORT csShaderExpression 
00044 {
00045 public:
00046   CS_LEAKGUARD_DECLARE (csShaderExpression);
00047 
00048   struct oper_arg 
00049   { 
00050     uint8 type;
00051     
00052     union 
00053     {
00054       float num;
00055       csStringID var;
00056       
00057       // Illegal outside of a cons cell
00058       int oper;
00059       cons * cell;
00060 
00061       // Special internal values
00062       int acc;
00063     };
00064     
00065     csVector4 vec4;
00066   };
00067 
00068   struct oper 
00069   {
00070     uint8 opcode, acc;
00071     oper_arg arg1, arg2;
00072   };
00073 
00074   typedef csArray<oper> oper_array;
00075   typedef csArray<oper_arg> arg_array;
00076 
00077 private:
00078   iObjectRegistry * obj_reg;
00080   static bool loaded;
00082 
00085   static csStringHash xmltokens;
00086   static csStringHash sexptokens;
00087   static csStringHash xmltypes;
00088   static csStringHash mnemonics;
00090 
00091   iShaderVariableContext * varContext;
00093   csRef<iStringSet> strset;
00095   oper_array opcodes;
00100   int accstack_max;
00106   arg_array accstack;
00107 
00109   bool parse_xml(cons *, iDocumentNode *);
00111   bool parse_xml_atom(oper_arg &, csStringID, const char *, const char *);
00113   bool parse_sexp(cons *, iDocumentNode *);
00116   bool parse_sexp_form(const char *& text, cons *);
00118   bool parse_sexp_atom(const char *& text, cons *);
00119 
00121   bool compile_cons(const cons *, int & acc_top);
00123   bool compile_make_vector(const cons *, int & acc_top, int acc);
00124 
00126   bool eval_const(cons *&);
00127 
00129   bool eval_oper(int oper, oper_arg arg1, oper_arg arg2, oper_arg & output);
00131   bool eval_oper(int oper, oper_arg arg1, oper_arg & output);
00133   bool eval_oper(int oper, oper_arg & output);
00134 
00136   bool eval_add(const oper_arg & arg1, const oper_arg & arg2,
00137         oper_arg & output) const;
00139   bool eval_sub(const oper_arg & arg1, const oper_arg & arg2,
00140         oper_arg & output) const;
00142   bool eval_mul(const oper_arg & arg1, const oper_arg & arg2,
00143         oper_arg & output) const;
00145   bool eval_div(const oper_arg & arg1, const oper_arg & arg2,
00146         oper_arg & output) const;
00147   
00149   bool eval_elt1(const oper_arg & arg1, oper_arg & output) const;
00151   bool eval_elt2(const oper_arg & arg1, oper_arg & output) const;
00153   bool eval_elt3(const oper_arg & arg1, oper_arg & output) const;
00155   bool eval_elt4(const oper_arg & arg1, oper_arg & output) const;
00156 
00158   bool eval_sin(const oper_arg & arg1, oper_arg & output) const;
00160   bool eval_cos(const oper_arg & arg1, oper_arg & output) const;
00162   bool eval_tan(const oper_arg & arg1, oper_arg & output) const;
00163   bool eval_dot(const oper_arg & arg1, const oper_arg & arg2,
00164         oper_arg & output) const;
00165   bool eval_cross(const oper_arg & arg1, const oper_arg & arg2,
00166         oper_arg & output) const;
00167   bool eval_vec_len(const oper_arg & arg1, oper_arg & output) const;
00168   bool eval_normal(const oper_arg & arg1, oper_arg & output) const;
00169 
00170   bool eval_pow(const oper_arg & arg1, const oper_arg & arg2,
00171         oper_arg & output) const;
00172   bool eval_min(const oper_arg & arg1, const oper_arg & arg2,
00173         oper_arg & output) const;
00174   bool eval_max(const oper_arg & arg1, const oper_arg & arg2,
00175         oper_arg & output) const;
00176 
00178   bool eval_time(oper_arg & output) const;
00180   bool eval_frame(oper_arg & output) const;
00181 
00183   bool eval_selt12(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00185   bool eval_selt34(const oper_arg & arg1, const oper_arg & arg2, oper_arg & output) const;
00187   bool eval_load(const oper_arg & arg1, oper_arg & output) const;
00188 
00190   bool eval_variable(csShaderVariable *, oper_arg & out);
00192   bool eval_argument(const oper_arg &, csShaderVariable *);
00193 
00195   void destruct_cons(cons *) const;
00197   void print_cons(const cons *) const;
00199   void print_ops(const oper_array &) const;
00200 
00201   inline const char * get_type_name(csStringID) const;
00202 
00203   csString* parseError;
00204   csString* evalError;
00205   csString errorMsg;
00206   void ParseError (const char* message, ...) const;
00207   void EvalError (const char* message, ...) const;
00208 public:
00209   csShaderExpression(iObjectRegistry *);
00210   ~csShaderExpression();
00211 
00213   bool Parse(iDocumentNode *, iShaderVariableContext *);
00218   bool Evaluate(csShaderVariable *);
00219 
00221   const char* GetError() const { return errorMsg; }
00222 };
00223 
00224 inline const char * csShaderExpression::get_type_name(csStringID id) const 
00225 {
00226   return xmltypes.Request(id);
00227 }
00228 
00229 #endif

Generated for Crystal Space by doxygen 1.4.4