00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef DXGRAPHICSSTATEGUARDIAN8_H
00016 #define DXGRAPHICSSTATEGUARDIAN8_H
00017
00018 #include "dxgsg8base.h"
00019 #include "dxTextureContext8.h"
00020 #include "config_dxgsg8.h"
00021
00022 #include "graphicsStateGuardian.h"
00023 #include "texture.h"
00024 #include "displayRegion.h"
00025 #include "material.h"
00026 #include "depthTestAttrib.h"
00027 #include "cullFaceAttrib.h"
00028 #include "renderModeAttrib.h"
00029 #include "colorBlendAttrib.h"
00030 #include "fog.h"
00031 #include "pointerToArray.h"
00032
00033 class Light;
00034
00035 class DXTextureContext8;
00036 class DXVertexBufferContext8;
00037 class DXIndexBufferContext8;
00038
00039
00040
00041
00042
00043
00044 class EXPCL_PANDADX DXGraphicsStateGuardian8 : public GraphicsStateGuardian {
00045 public:
00046 DXGraphicsStateGuardian8(GraphicsEngine *engine, GraphicsPipe *pipe);
00047 ~DXGraphicsStateGuardian8();
00048
00049 FrameBufferProperties
00050 calc_fb_properties(DWORD cformat, DWORD dformat, DWORD multisampletype);
00051
00052 virtual TextureContext *prepare_texture(Texture *tex, int view);
00053 void apply_texture(int i, TextureContext *tc);
00054 virtual bool update_texture(TextureContext *tc, bool force);
00055 bool upload_texture(DXTextureContext8 *dtc, bool force);
00056 virtual void release_texture(TextureContext *tc);
00057 virtual bool extract_texture_data(Texture *tex);
00058
00059 virtual VertexBufferContext *prepare_vertex_buffer(GeomVertexArrayData *data);
00060 bool apply_vertex_buffer(VertexBufferContext *vbc,
00061 const GeomVertexArrayDataHandle *reader, bool force);
00062 virtual void release_vertex_buffer(VertexBufferContext *vbc);
00063
00064 virtual IndexBufferContext *prepare_index_buffer(GeomPrimitive *data);
00065 bool apply_index_buffer(IndexBufferContext *ibc,
00066 const GeomPrimitivePipelineReader *reader, bool force);
00067 virtual void release_index_buffer(IndexBufferContext *ibc);
00068
00069 virtual PT(GeomMunger) make_geom_munger(const RenderState *state,
00070 Thread *current_thread);
00071
00072 virtual void clear(DrawableRegion *region);
00073
00074 virtual void prepare_display_region(DisplayRegionPipelineReader *dr);
00075 virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
00076 virtual bool prepare_lens();
00077
00078 virtual bool begin_frame(Thread *current_thread);
00079 virtual bool begin_scene();
00080 virtual void end_scene();
00081 virtual void end_frame(Thread *current_thread);
00082
00083 virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader,
00084 const GeomMunger *munger,
00085 const GeomVertexDataPipelineReader *data_reader,
00086 bool force);
00087 virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader,
00088 bool force);
00089 virtual bool draw_tristrips(const GeomPrimitivePipelineReader *reader,
00090 bool force);
00091 virtual bool draw_trifans(const GeomPrimitivePipelineReader *reader,
00092 bool force);
00093 virtual bool draw_lines(const GeomPrimitivePipelineReader *reader,
00094 bool force);
00095 virtual bool draw_linestrips(const GeomPrimitivePipelineReader *reader,
00096 bool force);
00097 virtual bool draw_points(const GeomPrimitivePipelineReader *reader,
00098 bool force);
00099 virtual void end_draw_primitives();
00100
00101 virtual bool framebuffer_copy_to_texture(Texture *tex, int z, const DisplayRegion *dr,
00102 const RenderBuffer &rb);
00103 virtual bool framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr,
00104 const RenderBuffer &rb);
00105 bool do_framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr,
00106 const RenderBuffer &rb, bool inverted);
00107
00108 virtual void reset();
00109
00110 virtual void apply_fog(Fog *fog);
00111
00112 virtual void bind_light(PointLight *light_obj, const NodePath &light,
00113 int light_id);
00114 virtual void bind_light(DirectionalLight *light_obj, const NodePath &light,
00115 int light_id);
00116 virtual void bind_light(Spotlight *light_obj, const NodePath &light,
00117 int light_id);
00118
00119 static D3DFORMAT get_index_type(Geom::NumericType numeric_type);
00120 INLINE static DWORD LColor_to_D3DCOLOR(const LColor &cLColor);
00121
00122 virtual void set_state_and_transform(const RenderState *state,
00123 const TransformState *transform);
00124 LPDIRECT3DDEVICE8 get_d3d_device();
00125 INLINE bool get_supports_render_texture() const;
00126
00127 static bool get_gamma_table(void);
00128 static bool static_set_gamma(bool restore, PN_stdfloat gamma);
00129 bool set_gamma(PN_stdfloat gamma);
00130 void restore_gamma();
00131 static void atexit_function(void);
00132
00133 protected:
00134 void do_issue_transform();
00135 void do_issue_alpha_test();
00136 void do_issue_render_mode();
00137 void do_issue_rescale_normal();
00138 void do_issue_color_write();
00139 void do_issue_depth_test();
00140 void do_issue_depth_write();
00141 void do_issue_cull_face();
00142 void do_issue_fog();
00143 void do_issue_depth_offset();
00144 void do_issue_tex_gen();
00145 void do_issue_shade_model();
00146 void do_issue_material();
00147 void do_issue_texture();
00148 void do_issue_blending();
00149 void do_issue_stencil();
00150 void do_issue_scissor();
00151
00152 void set_scissor(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top);
00153
00154 virtual void reissue_transforms();
00155
00156 virtual void enable_lighting(bool enable);
00157 virtual void set_ambient_light(const LColor &color);
00158 virtual void enable_light(int light_id, bool enable);
00159
00160 virtual void enable_clip_plane(int plane_id, bool enable);
00161 virtual void bind_clip_plane(const NodePath &plane, int plane_id);
00162
00163 virtual void close_gsg();
00164 void free_nondx_resources();
00165 void free_d3d_device();
00166
00167 void set_draw_buffer(const RenderBuffer &rb);
00168 void set_read_buffer(const RenderBuffer &rb);
00169
00170 void do_auto_rescale_normal();
00171
00172 protected:
00173 INLINE static D3DTEXTUREADDRESS get_texture_wrap_mode(Texture::WrapMode wm);
00174 INLINE static D3DFOGMODE get_fog_mode_type(Fog::Mode m);
00175 const D3DCOLORVALUE &get_light_color(Light *light) const;
00176 INLINE static D3DTRANSFORMSTATETYPE get_tex_mat_sym(int stage_index);
00177
00178 static D3DBLEND get_blend_func(ColorBlendAttrib::Operand operand);
00179 void report_texmgr_stats();
00180
00181 void set_context(DXScreenData *new_context);
00182 void set_render_target();
00183
00184 void set_texture_blend_mode(int i, const TextureStage *stage);
00185
00186 void dx_cleanup();
00187 HRESULT reset_d3d_device(D3DPRESENT_PARAMETERS *p_presentation_params,
00188 DXScreenData **screen = NULL);
00189
00190 bool check_cooperative_level();
00191
00192 void show_frame();
00193
00194 bool create_swap_chain (DXScreenData *new_context);
00195 bool release_swap_chain (DXScreenData *new_context);
00196 void copy_pres_reset(DXScreenData *new_context);
00197
00198 static D3DTEXTUREFILTERTYPE get_d3d_min_type(Texture::FilterType filter_type);
00199 static D3DTEXTUREFILTERTYPE get_d3d_mip_type(Texture::FilterType filter_type);
00200 static D3DTEXTUREOP get_texture_operation(TextureStage::CombineMode mode, int scale);
00201 static DWORD get_texture_argument(TextureStage::CombineSource source,
00202 TextureStage::CombineOperand operand);
00203 static DWORD get_texture_argument_modifier(TextureStage::CombineOperand operand);
00204
00205 void draw_primitive_up(D3DPRIMITIVETYPE primitive_type,
00206 unsigned int primitive_count,
00207 unsigned int first_vertex,
00208 unsigned int num_vertices,
00209 const unsigned char *buffer, size_t stride);
00210 void draw_indexed_primitive_up(D3DPRIMITIVETYPE primitive_type,
00211 unsigned int min_index, unsigned int max_index,
00212 unsigned int num_primitives,
00213 const unsigned char *index_data,
00214 D3DFORMAT index_type,
00215 const unsigned char *buffer, size_t stride);
00216
00217 INLINE static unsigned char *get_safe_buffer_start();
00218
00219 protected:
00220 DXScreenData *_screen;
00221 LPDIRECT3DDEVICE8 _d3d_device;
00222 IDirect3DSwapChain8 *_swap_chain;
00223 D3DPRESENT_PARAMETERS _presentation_reset;
00224
00225 bool _dx_is_ready;
00226 HRESULT _last_testcooplevel_result;
00227
00228 bool _vertex_blending_enabled;
00229 bool _supports_render_texture;
00230
00231 RenderBuffer::Type _cur_read_pixel_buffer;
00232 bool _auto_rescale_normal;
00233
00234 PN_stdfloat _material_ambient;
00235 PN_stdfloat _material_diffuse;
00236 PN_stdfloat _material_specular;
00237 PN_stdfloat _material_shininess;
00238 PN_stdfloat _material_emission;
00239
00240 enum DxgsgFogType {
00241 None,
00242 PerVertexFog=D3DRS_FOGVERTEXMODE,
00243 PerPixelFog=D3DRS_FOGTABLEMODE
00244 };
00245 DxgsgFogType _do_fog_type;
00246
00247 D3DVIEWPORT8 _current_viewport;
00248
00249 DWORD _clip_plane_bits;
00250 CullFaceAttrib::Mode _cull_face_mode;
00251 RenderModeAttrib::Mode _current_fill_mode;
00252
00253 const DXVertexBufferContext8 *_active_vbuffer;
00254 const DXIndexBufferContext8 *_active_ibuffer;
00255
00256 int _num_active_texture_stages;
00257
00258
00259
00260
00261 typedef pmap<NodePath, D3DLIGHT8> DirectionalLights;
00262 DirectionalLights _dlights;
00263
00264 bool _overlay_windows_supported;
00265 bool _tex_stats_retrieval_impossible;
00266
00267 static D3DMATRIX _d3d_ident_mat;
00268 CPT(TransformState) _scissor_mat;
00269
00270 static unsigned char *_temp_buffer;
00271 static unsigned char *_safe_buffer_start;
00272
00273 list <wdxGraphicsBuffer8 **> _graphics_buffer_list;
00274
00275 public:
00276 virtual TypeHandle get_type() const {
00277 return get_class_type();
00278 }
00279 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00280
00281 static TypeHandle get_class_type() {
00282 return _type_handle;
00283 }
00284
00285 public:
00286 static void init_type() {
00287 GraphicsStateGuardian::init_type();
00288 register_type(_type_handle, "DXGraphicsStateGuardian8",
00289 GraphicsStateGuardian::get_class_type());
00290 }
00291
00292 private:
00293 static TypeHandle _type_handle;
00294
00295 friend class wdxGraphicsWindow8;
00296 friend class wdxGraphicsBuffer8;
00297 friend class wdxGraphicsPipe8;
00298 friend class wdxGraphicsWindowGroup8;
00299 friend class DXTextureContext8;
00300 };
00301
00302 #include "dxGraphicsStateGuardian8.I"
00303
00304 #endif
00305