Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | File List | 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_CSGFX_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 public: 00204 csShaderExpression(iObjectRegistry *); 00205 ~csShaderExpression(); 00206 00208 bool Parse(iDocumentNode *, iShaderVariableContext *); 00210 00213 bool Evaluate(csShaderVariable *); 00214 }; 00215 00216 inline const char * csShaderExpression::get_type_name(csStringID id) const 00217 { 00218 return xmltypes.Request(id); 00219 } 00220 00221 #endif
Generated for Crystal Space by doxygen 1.3.9.1