00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef TINYGRAPHICSSTATEGUARDIAN_H
00016 #define TINYGRAPHICSSTATEGUARDIAN_H
00017
00018 #include "pandabase.h"
00019
00020 #include "graphicsStateGuardian.h"
00021 #include "colorBlendAttrib.h"
00022 #include "simpleLru.h"
00023 #include "zmath.h"
00024 #include "zbuffer.h"
00025 #include "zgl.h"
00026 #include "geomVertexReader.h"
00027
00028 class TinyTextureContext;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 class EXPCL_TINYDISPLAY TinyGraphicsStateGuardian : public GraphicsStateGuardian {
00044 public:
00045 TinyGraphicsStateGuardian(GraphicsEngine *engine, GraphicsPipe *pipe,
00046 TinyGraphicsStateGuardian *share_with);
00047
00048 virtual ~TinyGraphicsStateGuardian();
00049
00050 virtual void reset();
00051 virtual void free_pointers();
00052 virtual void close_gsg();
00053
00054 virtual bool depth_offset_decals();
00055
00056 virtual PT(GeomMunger) make_geom_munger(const RenderState *state,
00057 Thread *current_thread);
00058
00059 virtual void clear(DrawableRegion *clearable);
00060
00061 virtual void prepare_display_region(DisplayRegionPipelineReader *dr);
00062 virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
00063 virtual bool prepare_lens();
00064
00065 virtual bool begin_frame(Thread *current_thread);
00066 virtual bool begin_scene();
00067 virtual void end_scene();
00068 virtual void end_frame(Thread *current_thread);
00069
00070 virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader,
00071 const GeomMunger *munger,
00072 const GeomVertexDataPipelineReader *data_reader,
00073 bool force);
00074 virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader,
00075 bool force);
00076 virtual bool draw_tristrips(const GeomPrimitivePipelineReader *reader,
00077 bool force);
00078 virtual bool draw_lines(const GeomPrimitivePipelineReader *reader,
00079 bool force);
00080 virtual bool draw_points(const GeomPrimitivePipelineReader *reader,
00081 bool force);
00082 virtual void end_draw_primitives();
00083
00084 virtual bool framebuffer_copy_to_texture
00085 (Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb);
00086 virtual bool framebuffer_copy_to_ram
00087 (Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb);
00088
00089 virtual void set_state_and_transform(const RenderState *state,
00090 const TransformState *transform);
00091
00092 virtual TextureContext *prepare_texture(Texture *tex, int view);
00093 virtual bool update_texture(TextureContext *tc, bool force);
00094 bool update_texture(TextureContext *tc, bool force, int stage_index);
00095 virtual void release_texture(TextureContext *tc);
00096
00097 virtual void do_issue_light();
00098 virtual void bind_light(PointLight *light_obj, const NodePath &light,
00099 int light_id);
00100 virtual void bind_light(DirectionalLight *light_obj, const NodePath &light,
00101 int light_id);
00102 virtual void bind_light(Spotlight *light_obj, const NodePath &light,
00103 int light_id);
00104
00105 private:
00106 void do_issue_transform();
00107 void do_issue_render_mode();
00108 void do_issue_cull_face();
00109 void do_issue_rescale_normal();
00110 void do_issue_depth_offset();
00111 void do_issue_material();
00112 void do_issue_texture();
00113 void do_issue_scissor();
00114
00115 void set_scissor(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top);
00116
00117 bool apply_texture(TextureContext *tc);
00118 bool upload_texture(TinyTextureContext *gtc, bool force);
00119 bool upload_simple_texture(TinyTextureContext *gtc);
00120 bool setup_gltex(GLTexture *gltex, int x_size, int y_size, int num_levels);
00121 int get_tex_shift(int orig_size);
00122
00123 static void copy_lum_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level);
00124 static void copy_alpha_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level);
00125 static void copy_one_channel_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level, int channel);
00126 static void copy_la_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level);
00127 static void copy_rgb_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level);
00128 static void copy_rgba_image(ZTextureLevel *dest, int xsize, int ysize, TinyTextureContext *gtc, int level);
00129
00130 void setup_material(GLMaterial *gl_material, const Material *material);
00131 void do_auto_rescale_normal();
00132 static void load_matrix(M4 *matrix, const TransformState *transform);
00133 static int get_color_blend_op(ColorBlendAttrib::Operand operand);
00134 static ZB_lookupTextureFunc get_tex_filter_func(Texture::FilterType filter);
00135 static ZB_texWrapFunc get_tex_wrap_func(Texture::WrapMode wrap_mode);
00136
00137 INLINE void clear_light_state();
00138
00139
00140 class TexCoordData {
00141 public:
00142 GeomVertexReader _r1;
00143 GeomVertexReader _r2;
00144 LMatrix4 _mat;
00145 };
00146 typedef void GenTexcoordFunc(V2 &result, TexCoordData &tcdata);
00147
00148 static void texgen_null(V2 &result, TexCoordData &tcdata);
00149 static void texgen_simple(V2 &result, TexCoordData &tcdata);
00150 static void texgen_texmat(V2 &result, TexCoordData &tcdata);
00151 static void texgen_sphere_map(V2 &result, TexCoordData &tcdata);
00152 public:
00153
00154 ZBuffer *_current_frame_buffer;
00155
00156 private:
00157
00158
00159 ZBuffer *_aux_frame_buffer;
00160
00161 GLContext *_c;
00162
00163 enum ColorMaterialFlags {
00164 CMF_ambient = 0x001,
00165 CMF_diffuse = 0x002,
00166 };
00167 int _color_material_flags;
00168 int _texturing_state;
00169 int _texfilter_state;
00170 bool _texture_replace;
00171 bool _filled_flat;
00172 bool _auto_rescale_normal;
00173
00174 CPT(TransformState) _scissor_mat;
00175
00176
00177
00178
00179 typedef pmap<NodePath, GLLight> Lights;
00180 Lights _plights, _dlights, _slights;
00181
00182
00183 int _min_vertex;
00184 int _max_vertex;
00185 GLVertex *_vertices;
00186 int _vertices_size;
00187
00188 static PStatCollector _vertices_immediate_pcollector;
00189 static PStatCollector _draw_transform_pcollector;
00190 static PStatCollector _pixel_count_white_untextured_pcollector;
00191 static PStatCollector _pixel_count_flat_untextured_pcollector;
00192 static PStatCollector _pixel_count_smooth_untextured_pcollector;
00193 static PStatCollector _pixel_count_white_textured_pcollector;
00194 static PStatCollector _pixel_count_flat_textured_pcollector;
00195 static PStatCollector _pixel_count_smooth_textured_pcollector;
00196 static PStatCollector _pixel_count_white_perspective_pcollector;
00197 static PStatCollector _pixel_count_flat_perspective_pcollector;
00198 static PStatCollector _pixel_count_smooth_perspective_pcollector;
00199 static PStatCollector _pixel_count_smooth_multitex2_pcollector;
00200 static PStatCollector _pixel_count_smooth_multitex3_pcollector;
00201
00202 public:
00203 static TypeHandle get_class_type() {
00204 return _type_handle;
00205 }
00206 static void init_type() {
00207 GraphicsStateGuardian::init_type();
00208 register_type(_type_handle, "TinyGraphicsStateGuardian",
00209 GraphicsStateGuardian::get_class_type());
00210 }
00211 virtual TypeHandle get_type() const {
00212 return get_class_type();
00213 }
00214 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00215
00216 private:
00217 static TypeHandle _type_handle;
00218 };
00219
00220 #include "tinyGraphicsStateGuardian.I"
00221
00222 #endif