00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GRAPHICSSTATEGUARDIANBASE_H
00016 #define GRAPHICSSTATEGUARDIANBASE_H
00017
00018 #include "pandabase.h"
00019
00020 #include "typedWritableReferenceCount.h"
00021 #include "luse.h"
00022 #include "lightMutex.h"
00023
00024
00025
00026 class Thread;
00027 class RenderBuffer;
00028 class GraphicsWindow;
00029 class NodePath;
00030 class GraphicsOutputBase;
00031
00032 class VertexBufferContext;
00033 class IndexBufferContext;
00034 class OcclusionQueryContext;
00035 class GeomContext;
00036 class GeomNode;
00037 class Geom;
00038 class GeomPipelineReader;
00039 class GeomVertexData;
00040 class GeomVertexDataPipelineReader;
00041 class GeomVertexArrayData;
00042 class GeomPrimitive;
00043 class GeomPrimitivePipelineReader;
00044 class GeomTriangles;
00045 class GeomTristrips;
00046 class GeomTrifans;
00047 class GeomLines;
00048 class GeomLinestrips;
00049 class GeomPoints;
00050 class GeomMunger;
00051
00052 class SceneSetup;
00053 class PreparedGraphicsObjects;
00054 class GraphicsOutput;
00055 class Texture;
00056 class TextureContext;
00057 class ShaderContext;
00058 class Shader;
00059 class RenderState;
00060 class TransformState;
00061 class Material;
00062
00063 class ColorScaleAttrib;
00064 class TexMatrixAttrib;
00065 class ColorAttrib;
00066 class TextureAttrib;
00067 class LightAttrib;
00068 class MaterialAttrib;
00069 class RenderModeAttrib;
00070 class AntialiasAttrib;
00071 class RescaleNormalAttrib;
00072 class ColorBlendAttrib;
00073 class ColorWriteAttrib;
00074 class AlphaTestAttrib;
00075 class DepthTestAttrib;
00076 class DepthWriteAttrib;
00077 class TexGenAttrib;
00078 class ShaderAttrib;
00079 class CullFaceAttrib;
00080 class ClipPlaneAttrib;
00081 class ShadeModelAttrib;
00082 class TransparencyAttrib;
00083 class FogAttrib;
00084 class DepthOffsetAttrib;
00085
00086 class PointLight;
00087 class DirectionalLight;
00088 class Spotlight;
00089 class AmbientLight;
00090 class LightLensNode;
00091
00092 class DisplayRegion;
00093 class Lens;
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 class EXPCL_PANDA_GSGBASE GraphicsStateGuardianBase : public TypedWritableReferenceCount {
00112 PUBLISHED:
00113 virtual bool get_incomplete_render() const=0;
00114 virtual bool get_effective_incomplete_render() const=0;
00115
00116 virtual bool prefers_triangle_strips() const=0;
00117 virtual int get_max_vertices_per_array() const=0;
00118 virtual int get_max_vertices_per_primitive() const=0;
00119
00120 virtual int get_max_texture_dimension() const=0;
00121 virtual bool get_supports_compressed_texture_format(int compression_mode) const=0;
00122
00123 virtual bool get_supports_multisample() const=0;
00124 virtual int get_supported_geom_rendering() const=0;
00125 virtual bool get_supports_occlusion_query() const=0;
00126 virtual bool get_supports_shadow_filter() const=0;
00127
00128 public:
00129
00130
00131
00132 virtual SceneSetup *get_scene() const=0;
00133
00134 virtual void clear_before_callback()=0;
00135 virtual void clear_state_and_transform()=0;
00136
00137 virtual void remove_window(GraphicsOutputBase *window)=0;
00138
00139 #ifndef CPPPARSER
00140
00141
00142 virtual PreparedGraphicsObjects *get_prepared_objects()=0;
00143 #endif
00144
00145 virtual TextureContext *prepare_texture(Texture *tex, int view)=0;
00146 virtual bool update_texture(TextureContext *tc, bool force)=0;
00147 virtual void release_texture(TextureContext *tc)=0;
00148 virtual bool extract_texture_data(Texture *tex)=0;
00149
00150 virtual GeomContext *prepare_geom(Geom *geom)=0;
00151 virtual void release_geom(GeomContext *gc)=0;
00152
00153 virtual ShaderContext *prepare_shader(Shader *shader)=0;
00154 virtual void release_shader(ShaderContext *sc)=0;
00155
00156 virtual VertexBufferContext *prepare_vertex_buffer(GeomVertexArrayData *data)=0;
00157 virtual void release_vertex_buffer(VertexBufferContext *vbc)=0;
00158
00159 virtual IndexBufferContext *prepare_index_buffer(GeomPrimitive *data)=0;
00160 virtual void release_index_buffer(IndexBufferContext *ibc)=0;
00161
00162 virtual void begin_occlusion_query()=0;
00163 virtual PT(OcclusionQueryContext) end_occlusion_query()=0;
00164
00165 virtual PT(GeomMunger) get_geom_munger(const RenderState *state,
00166 Thread *current_thread)=0;
00167
00168 virtual void set_state_and_transform(const RenderState *state,
00169 const TransformState *transform)=0;
00170
00171
00172
00173
00174
00175
00176 virtual PN_stdfloat compute_distance_to(const LPoint3 &point) const=0;
00177
00178
00179
00180
00181
00182 virtual bool depth_offset_decals()=0;
00183 virtual CPT(RenderState) begin_decal_base_first()=0;
00184 virtual CPT(RenderState) begin_decal_nested()=0;
00185 virtual CPT(RenderState) begin_decal_base_second()=0;
00186 virtual void finish_decal()=0;
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader,
00197 const GeomMunger *munger,
00198 const GeomVertexDataPipelineReader *data_reader,
00199 bool force)=0;
00200 virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, bool force)=0;
00201 virtual bool draw_tristrips(const GeomPrimitivePipelineReader *reader, bool force)=0;
00202 virtual bool draw_trifans(const GeomPrimitivePipelineReader *reader, bool force)=0;
00203 virtual bool draw_lines(const GeomPrimitivePipelineReader *reader, bool force)=0;
00204 virtual bool draw_linestrips(const GeomPrimitivePipelineReader *reader, bool force)=0;
00205 virtual bool draw_points(const GeomPrimitivePipelineReader *reader, bool force)=0;
00206 virtual void end_draw_primitives()=0;
00207
00208 virtual bool framebuffer_copy_to_texture
00209 (Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb)=0;
00210 virtual bool framebuffer_copy_to_ram
00211 (Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb)=0;
00212
00213 virtual CoordinateSystem get_internal_coordinate_system() const=0;
00214 virtual const TransformState *get_cs_transform() const=0;
00215
00216 virtual void bind_light(PointLight *light_obj, const NodePath &light,
00217 int light_id) { }
00218 virtual void bind_light(DirectionalLight *light_obj, const NodePath &light,
00219 int light_id) { }
00220 virtual void bind_light(Spotlight *light_obj, const NodePath &light,
00221 int light_id) { }
00222
00223
00224
00225 virtual PT(Texture) make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host)=0;
00226
00227 PUBLISHED:
00228 static GraphicsStateGuardianBase *get_default_gsg();
00229 static void set_default_gsg(GraphicsStateGuardianBase *default_gsg);
00230
00231 static int get_num_gsgs();
00232 static GraphicsStateGuardianBase *get_gsg(int n);
00233 MAKE_SEQ(get_gsgs, get_num_gsgs, get_gsg);
00234
00235 public:
00236 static void add_gsg(GraphicsStateGuardianBase *gsg);
00237 static void remove_gsg(GraphicsStateGuardianBase *gsg);
00238
00239 private:
00240 typedef pvector<GraphicsStateGuardianBase *> GSGs;
00241 static GSGs _gsgs;
00242 static GraphicsStateGuardianBase *_default_gsg;
00243 static LightMutex _lock;
00244
00245 public:
00246 static TypeHandle get_class_type() {
00247 return _type_handle;
00248 }
00249 static void init_type() {
00250 TypedWritableReferenceCount::init_type();
00251 register_type(_type_handle, "GraphicsStateGuardianBase",
00252 TypedWritableReferenceCount::get_class_type());
00253 }
00254 virtual TypeHandle get_type() const {
00255 return get_class_type();
00256 }
00257 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00258
00259 private:
00260 static TypeHandle _type_handle;
00261 };
00262
00263 #endif