Panda3D
|
00001 // Filename: multitexReducer.h 00002 // Created by: drose (30Nov04) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #ifndef MULTITEXREDUCER_H 00016 #define MULTITEXREDUCER_H 00017 00018 #include "pandabase.h" 00019 #include "texture.h" 00020 #include "textureAttrib.h" 00021 #include "textureStage.h" 00022 #include "texMatrixAttrib.h" 00023 #include "transformState.h" 00024 #include "geomNode.h" 00025 #include "nodePath.h" 00026 #include "luse.h" 00027 #include "pointerTo.h" 00028 #include "pmap.h" 00029 #include "pvector.h" 00030 00031 class GraphicsOutput; 00032 class PandaNode; 00033 class RenderState; 00034 class TransformState; 00035 00036 //////////////////////////////////////////////////////////////////// 00037 // Class : MultitexReducer 00038 // Description : This object presents an interface for generating new 00039 // texture images that represent the combined images 00040 // from one or more individual textures, reproducing 00041 // certain kinds of multitexture effects without 00042 // depending on multitexture support in the hardware. 00043 // 00044 // This also flattens out texture matrices and removes 00045 // extra texture coordinates from the Geoms. It is thus 00046 // not a complete substitute for true multitexturing, 00047 // because it does not lend itself well to dynamic 00048 // animation of the textures once they have been 00049 // flattened. It is, however, useful for "baking in" a 00050 // particular multitexture effect. 00051 //////////////////////////////////////////////////////////////////// 00052 class EXPCL_PANDA_GRUTIL MultitexReducer { 00053 PUBLISHED: 00054 MultitexReducer(); 00055 ~MultitexReducer(); 00056 00057 void clear(); 00058 INLINE void scan(const NodePath &node); 00059 INLINE void scan(const NodePath &node, const NodePath &state_from); 00060 void scan(PandaNode *node, const RenderState *state, 00061 const TransformState *transform); 00062 00063 void set_target(TextureStage *stage); 00064 void set_use_geom(bool use_geom); 00065 void set_allow_tex_mat(bool allow_tex_mat); 00066 00067 void flatten(GraphicsOutput *window); 00068 00069 private: 00070 class StageInfo { 00071 public: 00072 StageInfo(TextureStage *stage, const TextureAttrib *ta, 00073 const TexMatrixAttrib *tma); 00074 00075 INLINE bool operator < (const StageInfo &other) const; 00076 00077 PT(TextureStage) _stage; 00078 PT(Texture) _tex; 00079 CPT(TransformState) _tex_mat; 00080 }; 00081 00082 typedef pvector<StageInfo> StageList; 00083 00084 class GeomInfo { 00085 public: 00086 INLINE GeomInfo(const RenderState *state, const RenderState *geom_net_state, 00087 GeomNode *geom_node, int index); 00088 00089 CPT(RenderState) _state; 00090 CPT(RenderState) _geom_net_state; 00091 PT(GeomNode) _geom_node; 00092 int _index; 00093 }; 00094 00095 typedef pvector<GeomInfo> GeomList; 00096 00097 class GeomNodeInfo { 00098 public: 00099 INLINE GeomNodeInfo(const RenderState *state, GeomNode *geom_node); 00100 CPT(RenderState) _state; 00101 PT(GeomNode) _geom_node; 00102 }; 00103 00104 typedef pvector<GeomNodeInfo> GeomNodeList; 00105 00106 typedef pmap<StageList, GeomList> Stages; 00107 Stages _stages; 00108 GeomNodeList _geom_node_list; 00109 00110 PT(TextureStage) _target_stage; 00111 bool _use_geom; 00112 bool _allow_tex_mat; 00113 00114 private: 00115 void scan_geom_node(GeomNode *node, const RenderState *state, 00116 const TransformState *transform); 00117 00118 void record_stage_list(const StageList &stage_list, 00119 const GeomInfo &geom_info); 00120 00121 size_t choose_model_stage(const StageList &stage_list) const; 00122 bool determine_uv_range(LTexCoord &min_uv, LTexCoord &max_uv, 00123 const StageInfo &model_stage, 00124 const GeomList &geom_list) const; 00125 00126 void get_uv_scale(LVecBase2 &uv_scale, LVecBase2 &uv_trans, 00127 const LTexCoord &min_uv, const LTexCoord &max_uv) const; 00128 00129 void choose_texture_size(int &x_size, int &y_size, 00130 const StageInfo &model_stage, 00131 const LVecBase2 &uv_scale, 00132 GraphicsOutput *window) const; 00133 00134 void make_texture_layer(const NodePath &render, 00135 const StageInfo &stage_info, 00136 const GeomList &geom_list, 00137 const LTexCoord &min_uv, const LTexCoord &max_uv, 00138 bool force_use_geom, bool transparent_base); 00139 void transfer_geom(GeomNode *geom_node, const InternalName *texcoord_name, 00140 const GeomList &geom_list, bool preserve_color); 00141 00142 void scan_color(const GeomList &geom_list, LColor &geom_color, 00143 int &num_colors) const; 00144 bool scan_decal(const StageList &stage_list) const; 00145 00146 }; 00147 00148 #include "multitexReducer.I" 00149 00150 #endif