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