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