mirror of
https://github.com/panda3d/panda3d.git
synced 2026-04-23 15:09:52 -05:00
pandadx7
This commit is contained in:
@@ -1,7 +1,4 @@
|
||||
// DX7 build is temporarily disabled until we bring it up-to-date with
|
||||
// the new Geom rewrite.
|
||||
#define BUILD_DIRECTORY
|
||||
//#define BUILD_DIRECTORY $[HAVE_DX]
|
||||
#define BUILD_DIRECTORY $[HAVE_DX]
|
||||
|
||||
// DIR_TYPE "metalib" indicates we are building a shared library that
|
||||
// consists mostly of references to other shared libraries. Under
|
||||
|
||||
@@ -119,6 +119,19 @@ is_active() const {
|
||||
return _active && _is_valid;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::is_valid
|
||||
// Access: Published
|
||||
// Description: Returns true if the GSG has been correctly
|
||||
// initialized within a graphics context, false if there
|
||||
// has been some problem or it hasn't been initialized
|
||||
// yet.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool GraphicsStateGuardian::
|
||||
is_valid() const {
|
||||
return _is_valid;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::get_properties
|
||||
// Access: Published
|
||||
@@ -619,19 +632,6 @@ mark_new() {
|
||||
_needs_reset = true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::is_valid
|
||||
// Access: Public
|
||||
// Description: Returns true if the GSG has been correctly
|
||||
// initialized within a graphics context, false if there
|
||||
// has been some problem or it hasn't been initialized
|
||||
// yet.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool GraphicsStateGuardian::
|
||||
is_valid() const {
|
||||
return _is_valid;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::get_transform
|
||||
// Access: Public
|
||||
|
||||
@@ -752,37 +752,6 @@ void GraphicsStateGuardian::
|
||||
end_frame() {
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::wants_normals
|
||||
// Access: Public, Virtual
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool GraphicsStateGuardian::
|
||||
wants_normals() const {
|
||||
return (_lighting_enabled || (_force_normals != 0));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::wants_texcoords
|
||||
// Access: Public, Virtual
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool GraphicsStateGuardian::
|
||||
wants_texcoords() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::wants_colors
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if the GSG should issue geometry color
|
||||
// commands, false otherwise.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool GraphicsStateGuardian::
|
||||
wants_colors() const {
|
||||
return _vertex_colors_enabled;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::depth_offset_decals
|
||||
// Access: Public, Virtual
|
||||
|
||||
@@ -76,6 +76,7 @@ PUBLISHED:
|
||||
|
||||
INLINE void set_active(bool active);
|
||||
INLINE bool is_active() const;
|
||||
INLINE bool is_valid() const;
|
||||
|
||||
INLINE const FrameBufferProperties &get_properties() const;
|
||||
INLINE GraphicsPipe *get_pipe() const;
|
||||
@@ -167,13 +168,6 @@ public:
|
||||
virtual void end_scene();
|
||||
virtual void end_frame();
|
||||
|
||||
// These functions will be queried by the GeomIssuer to determine if
|
||||
// it should issue normals, texcoords, and/or colors, based on the
|
||||
// GSG's current state.
|
||||
virtual bool wants_normals() const;
|
||||
virtual bool wants_texcoords() const;
|
||||
virtual bool wants_colors() const;
|
||||
|
||||
virtual bool depth_offset_decals();
|
||||
virtual CPT(RenderState) begin_decal_base_first();
|
||||
virtual CPT(RenderState) begin_decal_nested();
|
||||
@@ -194,7 +188,6 @@ public:
|
||||
INLINE bool reset_if_new();
|
||||
INLINE void mark_new();
|
||||
virtual void reset();
|
||||
INLINE bool is_valid() const;
|
||||
|
||||
INLINE CPT(TransformState) get_transform();
|
||||
|
||||
|
||||
@@ -169,11 +169,9 @@ munge_data_impl(const GeomVertexData *data) {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool StandardMunger::
|
||||
munge_geom_impl(CPT(Geom) &geom, CPT(GeomVertexData) &vertex_data) {
|
||||
int geom_rendering = geom->get_geom_rendering();
|
||||
int supported_geom_rendering = _gsg->get_supported_geom_rendering();
|
||||
|
||||
int unsupported_bits = geom_rendering & ~supported_geom_rendering;
|
||||
|
||||
int unsupported_bits = geom->get_geom_rendering() & ~supported_geom_rendering;
|
||||
if (unsupported_bits != 0) {
|
||||
// Even beyond munging the vertex format, we have to convert the
|
||||
// Geom itself into a new primitive type the GSG can render
|
||||
@@ -188,6 +186,10 @@ munge_geom_impl(CPT(Geom) &geom, CPT(GeomVertexData) &vertex_data) {
|
||||
// any GSG's that can support strips without also supporting
|
||||
// fans.
|
||||
geom = geom->decompose();
|
||||
|
||||
// Decomposing might produce an indexed Geom, so re-check the
|
||||
// unsupported bits.
|
||||
unsupported_bits = geom->get_geom_rendering() & ~supported_geom_rendering;
|
||||
}
|
||||
if ((unsupported_bits & Geom::GR_shade_model_bits) != 0) {
|
||||
// Rotate the vertices to account for different shade-model
|
||||
@@ -198,8 +200,10 @@ munge_geom_impl(CPT(Geom) &geom, CPT(GeomVertexData) &vertex_data) {
|
||||
if ((unsupported_bits & Geom::GR_indexed_bits) != 0) {
|
||||
// Convert indexed geometry to nonindexed geometry.
|
||||
PT(Geom) new_geom = geom->make_copy();
|
||||
new_geom->set_vertex_data(vertex_data);
|
||||
new_geom->make_nonindexed(false);
|
||||
geom = new_geom;
|
||||
vertex_data = new_geom->get_vertex_data();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
// DX7 build is temporarily disabled until we bring it up-to-date with
|
||||
// the new Geom rewrite.
|
||||
#define BUILD_DIRECTORY
|
||||
//#define BUILD_DIRECTORY $[HAVE_DX]
|
||||
#define BUILD_DIRECTORY $[HAVE_DX]
|
||||
|
||||
#define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m \
|
||||
dtoolutil:c dtoolbase:c dtool:m
|
||||
@@ -20,23 +17,19 @@
|
||||
putil linmath mathutil pnmimage event
|
||||
|
||||
#define COMBINED_SOURCES $[TARGET]_composite1.cxx
|
||||
|
||||
// need to install these due to external projects that link directly with libpandadx (bartop)
|
||||
#define INSTALL_HEADERS \
|
||||
config_dxgsg7.h dxGraphicsStateGuardian7.I dxGraphicsStateGuardian7.h \
|
||||
dxTextureContext7.h dxgsg7base.h
|
||||
|
||||
// build dxGraphicsStateGuardian separately since its so big
|
||||
|
||||
#define SOURCES \
|
||||
dxGraphicsStateGuardian7.cxx \
|
||||
dxGeomMunger7.I dxGeomMunger7.h \
|
||||
dxTextureContext7.I dxTextureContext7.h \
|
||||
wdxGraphicsPipe7.I wdxGraphicsPipe7.h \
|
||||
wdxGraphicsWindow7.I wdxGraphicsWindow7.h \
|
||||
wdxGraphicsWindow7.I wdxGraphicsWindow7.h
|
||||
$[INSTALL_HEADERS]
|
||||
|
||||
#define INCLUDED_SOURCES \
|
||||
config_dxgsg7.cxx \
|
||||
dxgsg7base.cxx \
|
||||
dxGeomMunger7.cxx \
|
||||
dxTextureContext7.cxx \
|
||||
wdxGraphicsPipe7.cxx wdxGraphicsWindow7.cxx
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
Configure(config_dxgsg7);
|
||||
NotifyCategoryDef(dxgsg7, ":display:gsg");
|
||||
NotifyCategoryDef(wdxdisplay7, "windisplay");
|
||||
NotifyCategoryDef(wdxdisplay7, "display");
|
||||
|
||||
// Configure this to TRUE if you want DirectX to control the entire screen,
|
||||
// If false, it will just blit into a window.
|
||||
@@ -76,6 +76,18 @@ ConfigVariableBool dx_do_vidmemsize_check
|
||||
ConfigVariableBool dx_preserve_fpu_state
|
||||
("dx-preserve-fpu-state", true);
|
||||
|
||||
ConfigVariableBool dx_broken_max_index
|
||||
("dx-broken-max-index", false,
|
||||
PRC_DESC("Configure this true if you have a buggy graphics driver that "
|
||||
"doesn't correctly implement the third parameter, NumVertices, "
|
||||
"of DrawIndexedPrimitive(). In particular, the NVIDIA Quadro "
|
||||
"driver version 6.14.10.7184 seems to treat this as a maximum "
|
||||
"vertex index, rather than a delta between the maximum and "
|
||||
"minimum vertex index. Turn this on if you are seeing stray "
|
||||
"triangles, or you are not seeing all of your triangles. Enabling "
|
||||
"this should work around this bug, at the cost of some additional "
|
||||
"rendering overhead on the GPU."));
|
||||
|
||||
#ifdef _DEBUG
|
||||
ConfigVariableDouble dx_global_miplevel_bias
|
||||
("dx-global-miplevel-bias", 0.0);
|
||||
@@ -112,6 +124,7 @@ init_libdxgsg7() {
|
||||
|
||||
DXGraphicsStateGuardian7::init_type();
|
||||
DXTextureContext7::init_type();
|
||||
DXGeomMunger7::init_type();
|
||||
|
||||
wdxGraphicsPipe7::init_type();
|
||||
wdxGraphicsWindow7::init_type();
|
||||
|
||||
@@ -47,6 +47,8 @@ extern ConfigVariableBool dx_preserve_fpu_state;
|
||||
extern ConfigVariableInt dx_force_backface_culling;
|
||||
#endif
|
||||
|
||||
extern ConfigVariableBool dx_broken_max_index;
|
||||
|
||||
#ifdef _DEBUG
|
||||
extern ConfigVariableDouble dx_global_miplevel_bias;
|
||||
extern ConfigVariableBool dx_debug_view_mipmaps;
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
// Filename: dxGeomMunger7.I
|
||||
// Created by: drose (11Mar05)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d-general@lists.sourceforge.net .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGeomMunger7::Constructor
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE DXGeomMunger7::
|
||||
DXGeomMunger7(GraphicsStateGuardian *gsg, const RenderState *state) :
|
||||
StandardMunger(gsg, state, 1, NT_packed_dabc, C_color),
|
||||
_texture(state->get_texture()),
|
||||
_tex_gen(state->get_tex_gen())
|
||||
{
|
||||
if (_texture != (TextureAttrib *)NULL) {
|
||||
_texture = _texture->filter_to_max(gsg->get_max_texture_stages());
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGeomMunger7::operator new
|
||||
// Access: Public
|
||||
// Description: Calls up to do_operator_new() to implement the
|
||||
// low-overhead allocation/deallocation for this type of
|
||||
// GeomMunger.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void *DXGeomMunger7::
|
||||
operator new(size_t size) {
|
||||
return do_operator_new(size, &_deleted_chain);
|
||||
}
|
||||
Executable
+156
@@ -0,0 +1,156 @@
|
||||
// Filename: dxGeomMunger7.cxx
|
||||
// Created by: drose (11Mar05)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d-general@lists.sourceforge.net .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dxGeomMunger7.h"
|
||||
#include "geomVertexReader.h"
|
||||
#include "geomVertexWriter.h"
|
||||
#include "config_dxgsg7.h"
|
||||
|
||||
GeomMunger *DXGeomMunger7::_deleted_chain = NULL;
|
||||
TypeHandle DXGeomMunger7::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGeomMunger7::munge_format_impl
|
||||
// Access: Protected, Virtual
|
||||
// Description: Given a source GeomVertexFormat, converts it if
|
||||
// necessary to the appropriate format for rendering.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CPT(GeomVertexFormat) DXGeomMunger7::
|
||||
munge_format_impl(const GeomVertexFormat *orig,
|
||||
const GeomVertexAnimationSpec &animation) {
|
||||
nassertr(animation.get_animation_type() != AT_hardware, NULL);
|
||||
|
||||
// We have to build a completely new format that includes only the
|
||||
// appropriate components, in the appropriate order, in just one
|
||||
// array.
|
||||
PT(GeomVertexFormat) new_format = new GeomVertexFormat(*orig);
|
||||
PT(GeomVertexArrayFormat) new_array_format = new GeomVertexArrayFormat;
|
||||
|
||||
const GeomVertexColumn *vertex_type = orig->get_vertex_column();
|
||||
const GeomVertexColumn *normal_type = orig->get_normal_column();
|
||||
const GeomVertexColumn *color_type = orig->get_color_column();
|
||||
|
||||
if (vertex_type != (const GeomVertexColumn *)NULL) {
|
||||
new_array_format->add_column
|
||||
(InternalName::get_vertex(), 3, NT_float32,
|
||||
vertex_type->get_contents());
|
||||
new_format->remove_column(vertex_type->get_name());
|
||||
|
||||
} else {
|
||||
// If we don't have a vertex type, not much we can do.
|
||||
return orig;
|
||||
}
|
||||
|
||||
if (normal_type != (const GeomVertexColumn *)NULL) {
|
||||
new_array_format->add_column
|
||||
(InternalName::get_normal(), 3, NT_float32, C_vector);
|
||||
new_format->remove_column(normal_type->get_name());
|
||||
}
|
||||
|
||||
if (color_type != (const GeomVertexColumn *)NULL) {
|
||||
new_array_format->add_column
|
||||
(InternalName::get_color(), 1, NT_packed_dabc, C_color);
|
||||
new_format->remove_column(color_type->get_name());
|
||||
}
|
||||
|
||||
// To support multitexture, we will need to add all of the relevant
|
||||
// texcoord types, and in the correct order.
|
||||
|
||||
// Now set up each of the active texture coordinate stages--or at
|
||||
// least those for which we're not generating texture coordinates
|
||||
// automatically.
|
||||
|
||||
// Now copy all of the texture coordinates in, in order by stage
|
||||
// index. But we have to reuse previous columns.
|
||||
if (_texture != (TextureAttrib *)NULL) {
|
||||
typedef pset<const InternalName *> UsedStages;
|
||||
UsedStages used_stages;
|
||||
|
||||
int num_stages = _texture->get_num_on_stages();
|
||||
for (int i = 0; i < num_stages; ++i) {
|
||||
TextureStage *stage = _texture->get_on_stage(i);
|
||||
|
||||
const InternalName *name = stage->get_texcoord_name();
|
||||
if (used_stages.insert(name).second) {
|
||||
// This is the first time we've encountered this texcoord name.
|
||||
const GeomVertexColumn *texcoord_type = orig->get_column(name);
|
||||
|
||||
if (texcoord_type != (const GeomVertexColumn *)NULL) {
|
||||
new_array_format->add_column
|
||||
(name, texcoord_type->get_num_values(), NT_float32, C_texcoord);
|
||||
} else {
|
||||
// We have to add something as a placeholder, even if the
|
||||
// texture coordinates aren't defined.
|
||||
new_array_format->add_column(name, 2, NT_float32, C_texcoord);
|
||||
}
|
||||
new_format->remove_column(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure the FVF-style array we just built up is first in the
|
||||
// list.
|
||||
new_format->insert_array(0, new_array_format);
|
||||
|
||||
return GeomVertexFormat::register_format(new_format);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGeomMunger7::compare_to_impl
|
||||
// Access: Protected, Virtual
|
||||
// Description: Called to compare two GeomMungers who are known to be
|
||||
// of the same type, for an apples-to-apples comparison.
|
||||
// This will never be called on two pointers of a
|
||||
// different type.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int DXGeomMunger7::
|
||||
compare_to_impl(const GeomMunger *other) const {
|
||||
const DXGeomMunger7 *om = DCAST(DXGeomMunger7, other);
|
||||
if (_texture != om->_texture) {
|
||||
return _texture < om->_texture ? -1 : 1;
|
||||
}
|
||||
if (_tex_gen != om->_tex_gen) {
|
||||
return _tex_gen < om->_tex_gen ? -1 : 1;
|
||||
}
|
||||
|
||||
return StandardMunger::compare_to_impl(other);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGeomMunger7::geom_compare_to_impl
|
||||
// Access: Protected, Virtual
|
||||
// Description: Called to compare two GeomMungers who are known to be
|
||||
// of the same type, for an apples-to-apples comparison.
|
||||
// This will never be called on two pointers of a
|
||||
// different type.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int DXGeomMunger7::
|
||||
geom_compare_to_impl(const GeomMunger *other) const {
|
||||
// Unlike GLGeomMunger, we do consider _texture and _tex_gen
|
||||
// important for this purpose, since they control the number and
|
||||
// order of texture coordinates we might put into the FVF.
|
||||
const DXGeomMunger7 *om = DCAST(DXGeomMunger7, other);
|
||||
if (_texture != om->_texture) {
|
||||
return _texture < om->_texture ? -1 : 1;
|
||||
}
|
||||
if (_tex_gen != om->_tex_gen) {
|
||||
return _tex_gen < om->_tex_gen ? -1 : 1;
|
||||
}
|
||||
|
||||
return StandardMunger::geom_compare_to_impl(other);
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
// Filename: dxGeomMunger7.h
|
||||
// Created by: drose (11Mar05)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d-general@lists.sourceforge.net .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef DXGEOMMUNGER7_H
|
||||
#define DXGEOMMUNGER7_H
|
||||
|
||||
#include "pandabase.h"
|
||||
#include "standardMunger.h"
|
||||
#include "graphicsStateGuardian.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : DXGeomMunger7
|
||||
// Description : This specialization on GeomMunger finesses vertices
|
||||
// for DirectX rendering. In particular, it makes sure
|
||||
// colors are stored in DirectX's packed_argb format,
|
||||
// and that all relevant components are packed into a
|
||||
// single array, in the correct order.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDADX DXGeomMunger7 : public StandardMunger {
|
||||
public:
|
||||
INLINE DXGeomMunger7(GraphicsStateGuardian *gsg, const RenderState *state);
|
||||
|
||||
protected:
|
||||
virtual CPT(GeomVertexFormat) munge_format_impl(const GeomVertexFormat *orig,
|
||||
const GeomVertexAnimationSpec &animation);
|
||||
|
||||
virtual int compare_to_impl(const GeomMunger *other) const;
|
||||
virtual int geom_compare_to_impl(const GeomMunger *other) const;
|
||||
|
||||
public:
|
||||
INLINE void *operator new(size_t size);
|
||||
|
||||
private:
|
||||
CPT(TextureAttrib) _texture;
|
||||
CPT(TexGenAttrib) _tex_gen;
|
||||
|
||||
static GeomMunger *_deleted_chain;
|
||||
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
StandardMunger::init_type();
|
||||
register_type(_type_handle, "DXGeomMunger7",
|
||||
StandardMunger::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "dxGeomMunger7.I"
|
||||
|
||||
#endif
|
||||
@@ -18,347 +18,113 @@
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_line_smooth
|
||||
// Access:
|
||||
// Description:
|
||||
// Function: DXGraphicsStateGuardian7::Colorf_to_D3DCOLOR
|
||||
// Access: Public, Static
|
||||
// Description: Converts Panda's floating-point Colorf structure to
|
||||
// DirectX's D3DCOLOR packed structure.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_line_smooth(bool val) {
|
||||
if(_line_smooth_enabled != val) {
|
||||
_line_smooth_enabled = val;
|
||||
#ifndef NDEBUG
|
||||
{
|
||||
if(val && (_pScrn->D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES))
|
||||
dxgsg7_cat.error() << "no HW support for line smoothing!!\n";
|
||||
INLINE DWORD DXGraphicsStateGuardian7::
|
||||
Colorf_to_D3DCOLOR(const Colorf &cColorf) {
|
||||
// MS VC defines _M_IX86 for x86. gcc should define _X86_
|
||||
#if defined(_M_IX86) || defined(_X86_)
|
||||
DWORD d3dcolor,tempcolorval=255;
|
||||
|
||||
// note the default FPU rounding mode will give 255*0.5f=0x80, not 0x7F as VC would force it to by resetting rounding mode
|
||||
// dont think this makes much difference
|
||||
|
||||
__asm {
|
||||
push ebx ; want to save this in case this fn is inlined
|
||||
push ecx
|
||||
mov ecx, cColorf
|
||||
fild tempcolorval
|
||||
fld DWORD PTR [ecx]
|
||||
fmul ST(0),ST(1)
|
||||
fistp tempcolorval ; no way to store directly to int register
|
||||
mov eax, tempcolorval
|
||||
shl eax, 16
|
||||
|
||||
fld DWORD PTR [ecx+4] ;grn
|
||||
fmul ST(0),ST(1)
|
||||
fistp tempcolorval
|
||||
mov ebx,tempcolorval
|
||||
shl ebx, 8
|
||||
or eax,ebx
|
||||
|
||||
fld DWORD PTR [ecx+8] ;blue
|
||||
fmul ST(0),ST(1)
|
||||
fistp tempcolorval
|
||||
or eax,tempcolorval
|
||||
|
||||
fld DWORD PTR [ecx+12] ;alpha
|
||||
fmul ST(0),ST(1)
|
||||
fistp tempcolorval
|
||||
; simulate pop 255.0 off FP stack w/o store, mark top as empty and increment stk ptr
|
||||
ffree ST(0)
|
||||
fincstp
|
||||
mov ebx,tempcolorval
|
||||
shl ebx, 24
|
||||
or eax,ebx
|
||||
mov d3dcolor,eax
|
||||
pop ecx
|
||||
pop ebx
|
||||
}
|
||||
#endif
|
||||
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_EDGEANTIALIAS, (DWORD)val);
|
||||
// dxgsg7_cat.debug() << (void*)d3dcolor << endl;
|
||||
return d3dcolor;
|
||||
#else //!_X86_
|
||||
return MY_D3DRGBA(cColorf[0], cColorf[1], cColorf[2], cColorf[3]);
|
||||
#endif //!_X86_
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::get_texture_wrap_mode
|
||||
// Access: Protected, Static
|
||||
// Description: Maps from the Texture's internal wrap mode symbols to
|
||||
// GL's.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE D3DTEXTUREADDRESS DXGraphicsStateGuardian7::
|
||||
get_texture_wrap_mode(Texture::WrapMode wm) {
|
||||
switch (wm) {
|
||||
case Texture::WM_clamp:
|
||||
return D3DTADDRESS_CLAMP;
|
||||
case Texture::WM_repeat:
|
||||
return D3DTADDRESS_WRAP;
|
||||
case Texture::WM_mirror:
|
||||
return D3DTADDRESS_MIRROR;
|
||||
case Texture::WM_mirror_once:
|
||||
return D3DTADDRESS_BORDER;
|
||||
case Texture::WM_border_color:
|
||||
return D3DTADDRESS_BORDER;
|
||||
}
|
||||
dxgsg7_cat.error() << "Invalid Texture::Mode value" << endl;
|
||||
return D3DTADDRESS_WRAP;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_dither
|
||||
// Access:
|
||||
// Description:
|
||||
// Function: DXGraphicsStateGuardian7::get_fog_mode_type
|
||||
// Access: Protected, Static
|
||||
// Description: Maps from the fog types to gl version
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_dither(bool val) {
|
||||
if (_dither_enabled != val) {
|
||||
_dither_enabled = val;
|
||||
|
||||
#ifndef NDEBUG
|
||||
{
|
||||
if(val && !(_pScrn->D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_DITHER))
|
||||
dxgsg7_cat.error() << "no HW support for color dithering!!\n";
|
||||
}
|
||||
#endif
|
||||
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, (DWORD)val);
|
||||
INLINE D3DFOGMODE DXGraphicsStateGuardian7::
|
||||
get_fog_mode_type(Fog::Mode m) {
|
||||
switch (m) {
|
||||
case Fog::M_linear:
|
||||
return D3DFOG_LINEAR;
|
||||
case Fog::M_exponential:
|
||||
return D3DFOG_EXP;
|
||||
case Fog::M_exponential_squared:
|
||||
return D3DFOG_EXP2;
|
||||
}
|
||||
dxgsg7_cat.error() << "Invalid Fog::Mode value" << endl;
|
||||
return D3DFOG_EXP;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_stencil_test
|
||||
// Access:
|
||||
// Description:
|
||||
// Function: DXGraphicsStateGuardian7::get_tex_mat_sym
|
||||
// Access: Protected, Static
|
||||
// Description: Returns the nth D3DTRANSFORMSTATE_TEXTURE(n) constant.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_stencil_test(bool val) {
|
||||
if (_stencil_test_enabled != val) {
|
||||
_stencil_test_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_STENCILENABLE, (DWORD)val);
|
||||
}
|
||||
INLINE D3DTRANSFORMSTATETYPE DXGraphicsStateGuardian7::
|
||||
get_tex_mat_sym(int stage_index) {
|
||||
return (D3DTRANSFORMSTATETYPE)(D3DTRANSFORMSTATE_TEXTURE0 + stage_index);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_color_material
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_color_material(bool val) {
|
||||
if (_color_material_enabled != val) {
|
||||
_color_material_enabled = val;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_blend
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_blend(bool val) {
|
||||
if (_blend_enabled != val) {
|
||||
_blend_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, (DWORD)val);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_blend
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
set_shademode(D3DSHADEMODE val) {
|
||||
if (_CurShadeMode != val) {
|
||||
_CurShadeMode = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_SHADEMODE, (DWORD)val);
|
||||
}
|
||||
}
|
||||
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_primitive_clipping(bool val) {
|
||||
if (_clipping_enabled != val) {
|
||||
_clipping_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_CLIPPING, (DWORD)val);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_fog
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_fog(bool val) {
|
||||
if ((_fog_enabled != val) && (_doFogType!=None)) {
|
||||
_fog_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, (DWORD)val);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_alpha_test
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_alpha_test(bool val )
|
||||
{
|
||||
if (_alpha_test_enabled != val) {
|
||||
_alpha_test_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, (DWORD)val);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::call_dxLightModelAmbient
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
call_dxLightModelAmbient( const Colorf& color)
|
||||
{
|
||||
if (_lmodel_ambient != color) {
|
||||
_lmodel_ambient = color;
|
||||
#ifdef GSG_VERBOSE
|
||||
dxgsg7_cat.debug() << "dxLightModel(LIGHT_MODEL_AMBIENT, " << color << ")" << endl;
|
||||
#endif
|
||||
_pScrn->pD3DDevice->SetRenderState( D3DRENDERSTATE_AMBIENT,
|
||||
D3DRGBA(color[0], color[1], color[2], color[3]));
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::call_dxAlphaFunc
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
call_dxAlphaFunc(D3DCMPFUNC func, float reference_alpha) {
|
||||
if (_alpha_func != func) {
|
||||
_alpha_func = func;
|
||||
#ifdef GSG_VERBOSE
|
||||
dxgsg7_cat.debug() << "dxAlphaFunc(";
|
||||
switch (func) {
|
||||
case D3DCMP_NEVER:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_NEVER";
|
||||
break;
|
||||
case D3DCMP_LESS:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_LESS";
|
||||
break;
|
||||
case D3DCMP_EQUAL:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_EQUAL";
|
||||
break;
|
||||
#ifdef D3DCMP_LEQUAL
|
||||
case D3DCMP_LEQUAL:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_LEQUAL";
|
||||
break;
|
||||
#endif
|
||||
case D3DCMP_GREATER:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_GREATER";
|
||||
break;
|
||||
case D3DCMP_NOTEQUAL:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_NOTEQUAL";
|
||||
break;
|
||||
#ifdef D3DCMP_GEQUAL
|
||||
case D3DCMP_GEQUAL:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_GEQUAL";
|
||||
break;
|
||||
#endif
|
||||
case D3DCMP_ALWAYS:
|
||||
dxgsg7_cat.debug(false) << "D3DCMP_ALWAYS";
|
||||
break;
|
||||
}
|
||||
dxgsg7_cat.debug() << " , " << reference_alpha << ")" << endl;
|
||||
#endif
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHAFUNC, func);
|
||||
}
|
||||
|
||||
if(_alpha_func_refval != reference_alpha) {
|
||||
_alpha_func_refval = reference_alpha;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHAREF, (UINT) (reference_alpha*255.0f)); //d3d uses 0x0-0xFF, not a float
|
||||
}
|
||||
}
|
||||
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
call_dxBlendFunc(D3DBLEND sfunc, D3DBLEND dfunc )
|
||||
{
|
||||
if (_blend_source_func != sfunc)
|
||||
{
|
||||
_blend_source_func = sfunc;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, sfunc);
|
||||
#ifdef GSG_VERBOSE
|
||||
dxgsg7_cat.debug() << "dxSrcBlendFunc(";
|
||||
switch (sfunc)
|
||||
{
|
||||
case D3DBLEND_ZERO:
|
||||
dxgsg7_cat.debug(false) << "ZERO, ";
|
||||
break;
|
||||
case D3DBLEND_ONE:
|
||||
dxgsg7_cat.debug(false) << "ONE, ";
|
||||
break;
|
||||
case D3DBLEND_DESTCOLOR:
|
||||
dxgsg7_cat.debug(false) << "DESTCOLOR, ";
|
||||
break;
|
||||
case D3DBLEND_INVDESTCOLOR:
|
||||
dxgsg7_cat.debug(false) << "INVDESTCOLOR, ";
|
||||
break;
|
||||
case D3DBLEND_SRCALPHA:
|
||||
dxgsg7_cat.debug(false) << "SRCALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_INVSRCALPHA:
|
||||
dxgsg7_cat.debug(false) << "INVSRCALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_DESTALPHA:
|
||||
dxgsg7_cat.debug(false) << "DESTALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_INVDESTALPHA:
|
||||
dxgsg7_cat.debug(false) << "INVDESTALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_SRCALPHASAT:
|
||||
dxgsg7_cat.debug(false) << "SRCALPHASAT, ";
|
||||
break;
|
||||
default:
|
||||
dxgsg7_cat.debug(false) << "unknown, ";
|
||||
break;
|
||||
}
|
||||
dxgsg7_cat.debug(false) << endl;
|
||||
#endif
|
||||
}
|
||||
if ( _blend_dest_func != dfunc)
|
||||
{
|
||||
_blend_dest_func = dfunc;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, dfunc);
|
||||
#ifdef GSG_VERBOSE
|
||||
dxgsg7_cat.debug() << "dxDstBlendFunc(";
|
||||
switch (dfunc)
|
||||
{
|
||||
case D3DBLEND_ZERO:
|
||||
dxgsg7_cat.debug(false) << "ZERO, ";
|
||||
break;
|
||||
case D3DBLEND_ONE:
|
||||
dxgsg7_cat.debug(false) << "ONE, ";
|
||||
break;
|
||||
case D3DBLEND_DESTCOLOR:
|
||||
dxgsg7_cat.debug(false) << "DESTCOLOR, ";
|
||||
break;
|
||||
case D3DBLEND_INVDESTCOLOR:
|
||||
dxgsg7_cat.debug(false) << "INVDESTCOLOR, ";
|
||||
break;
|
||||
case D3DBLEND_SRCALPHA:
|
||||
dxgsg7_cat.debug(false) << "SRCALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_INVSRCALPHA:
|
||||
dxgsg7_cat.debug(false) << "INVSRCALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_DESTALPHA:
|
||||
dxgsg7_cat.debug(false) << "DESTALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_INVDESTALPHA:
|
||||
dxgsg7_cat.debug(false) << "INVDESTALPHA, ";
|
||||
break;
|
||||
case D3DBLEND_SRCALPHASAT:
|
||||
dxgsg7_cat.debug(false) << "SRCALPHASAT, ";
|
||||
break;
|
||||
}
|
||||
dxgsg7_cat.debug(false) << endl;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_zwritemask(bool val) {
|
||||
if (_depth_write_enabled != val) {
|
||||
_depth_write_enabled = val;
|
||||
_pScrn->pD3DDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, val);
|
||||
}
|
||||
}
|
||||
|
||||
/** unimplemented
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_multisample
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_multisample(bool val) {
|
||||
_multisample_enabled = val;
|
||||
#ifdef NDEBUG
|
||||
dxgsg7_cat.error() << "dx multisample unimplemented!!\n";
|
||||
#endif
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_multisample_alpha_one
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_multisample_alpha_one(bool val) {
|
||||
if (_multisample_alpha_one_enabled != val) {
|
||||
_multisample_alpha_one_enabled = val;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_multisample_alpha_mask
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_multisample_alpha_mask(bool val) {
|
||||
if (_multisample_alpha_mask_enabled != val) {
|
||||
_multisample_alpha_mask_enabled = val;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXGraphicsStateGuardian7::enable_point_smooth
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void DXGraphicsStateGuardian7::
|
||||
enable_point_smooth(bool val) {
|
||||
// _point_smooth_enabled = val;
|
||||
|
||||
#ifdef NDEBUG
|
||||
dxgsg7_cat.error() << "dx point smoothing unimplemented!!\n";
|
||||
#endif
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -19,98 +19,70 @@
|
||||
#ifndef DXGRAPHICSSTATEGUARDIAN7_H
|
||||
#define DXGRAPHICSSTATEGUARDIAN7_H
|
||||
|
||||
//#define GSG_VERBOSE 1
|
||||
|
||||
#include "dxgsg7base.h"
|
||||
#include "dxTextureContext7.h"
|
||||
#include "config_dxgsg7.h"
|
||||
|
||||
#include "graphicsStateGuardian.h"
|
||||
#include "geomprimitives.h"
|
||||
#include "texture.h"
|
||||
#include "displayRegion.h"
|
||||
#include "material.h"
|
||||
#include "depthTestAttrib.h"
|
||||
#include "cullFaceAttrib.h"
|
||||
#include "renderModeAttrib.h"
|
||||
#include "fog.h"
|
||||
#include "pointerToArray.h"
|
||||
#include "graphicsWindow.h"
|
||||
|
||||
class Light;
|
||||
|
||||
//#if defined(NOTIFY_DEBUG) || defined(DO_PSTATS)
|
||||
#ifdef _DEBUG
|
||||
// This function now serves both to print a debug message to the
|
||||
// console, as well as to notify PStats about the change in texture
|
||||
// memory. Thus, we compile it in if we are building with support for
|
||||
// either notify debug messages or PStats; otherwise, we compile it
|
||||
// out.
|
||||
extern void dbgPrintVidMem(LPDIRECTDRAW7 pDD, LPDDSCAPS2 lpddsCaps,const char *pMsg);
|
||||
#define PRINTVIDMEM(pDD,pCaps,pMsg) dbgPrintVidMem(pDD,pCaps,pMsg)
|
||||
#else
|
||||
#define PRINTVIDMEM(pDD,pCaps,pMsg)
|
||||
#endif
|
||||
class DXVertexBufferContext7;
|
||||
class DXIndexBufferContext7;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : DXGraphicsStateGuardian7
|
||||
// Description : A GraphicsStateGuardian specialized for rendering
|
||||
// into DX. There should be no DX calls
|
||||
// outside of this object.
|
||||
// Class : DXGraphicsStateGuardian7
|
||||
// Description : A GraphicsStateGuardian for rendering into DirectX7
|
||||
// contexts.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDADX DXGraphicsStateGuardian7 : public GraphicsStateGuardian {
|
||||
friend class wdxGraphicsWindow7;
|
||||
friend class wdxGraphicsPipe7;
|
||||
friend class wdxGraphicsWindow7Group;
|
||||
friend class DXTextureContext7;
|
||||
|
||||
public:
|
||||
DXGraphicsStateGuardian7(const FrameBufferProperties &properties);
|
||||
~DXGraphicsStateGuardian7();
|
||||
|
||||
virtual void reset();
|
||||
virtual TextureContext *prepare_texture(Texture *tex);
|
||||
void apply_texture(int i, TextureContext *tc);
|
||||
virtual void release_texture(TextureContext *tc);
|
||||
|
||||
virtual PT(GeomMunger) make_geom_munger(const RenderState *state);
|
||||
|
||||
virtual void set_color_clear_value(const Colorf &value);
|
||||
|
||||
virtual void do_clear(const RenderBuffer &buffer);
|
||||
|
||||
virtual void prepare_display_region();
|
||||
virtual bool prepare_lens();
|
||||
|
||||
virtual void draw_point(GeomPoint *geom, GeomContext *gc);
|
||||
virtual void draw_line(GeomLine *geom, GeomContext *gc);
|
||||
virtual void draw_linestrip(GeomLinestrip *geom, GeomContext *gc);
|
||||
void draw_linestrip_base(Geom *geom, GeomContext *gc, bool bConnectEnds);
|
||||
virtual void draw_sprite(GeomSprite *geom, GeomContext *gc);
|
||||
virtual void draw_polygon(GeomPolygon *geom, GeomContext *gc);
|
||||
virtual void draw_quad(GeomQuad *geom, GeomContext *gc);
|
||||
virtual void draw_tri(GeomTri *geom, GeomContext *gc);
|
||||
virtual void draw_tristrip(GeomTristrip *geom, GeomContext *gc);
|
||||
virtual void draw_trifan(GeomTrifan *geom, GeomContext *gc);
|
||||
virtual void draw_sphere(GeomSphere *geom, GeomContext *gc);
|
||||
virtual bool begin_frame();
|
||||
virtual bool begin_scene();
|
||||
virtual void end_scene();
|
||||
virtual void end_frame();
|
||||
|
||||
virtual TextureContext *prepare_texture(Texture *tex);
|
||||
void apply_texture(TextureContext *tc);
|
||||
virtual void release_texture(TextureContext *tc);
|
||||
virtual bool begin_draw_primitives(const Geom *geom,
|
||||
const GeomMunger *munger,
|
||||
const GeomVertexData *vertex_data);
|
||||
void determine_fvf();
|
||||
virtual void draw_triangles(const GeomTriangles *primitive);
|
||||
virtual void draw_lines(const GeomLines *primitive);
|
||||
virtual void draw_points(const GeomPoints *primitive);
|
||||
virtual void end_draw_primitives();
|
||||
|
||||
virtual void framebuffer_copy_to_texture(Texture *tex, int z, const DisplayRegion *dr,
|
||||
const RenderBuffer &rb);
|
||||
|
||||
virtual bool framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr,
|
||||
const RenderBuffer &rb);
|
||||
|
||||
virtual void apply_material(const Material *material);
|
||||
virtual void apply_fog(Fog *fog);
|
||||
virtual void reset();
|
||||
|
||||
virtual void issue_transform(const TransformState *transform);
|
||||
virtual void issue_tex_matrix(const TexMatrixAttrib *attrib);
|
||||
virtual void issue_texture(const TextureAttrib *attrib);
|
||||
virtual void issue_material(const MaterialAttrib *attrib);
|
||||
virtual void issue_render_mode(const RenderModeAttrib *attrib);
|
||||
virtual void issue_rescale_normal(const RescaleNormalAttrib *attrib);
|
||||
virtual void issue_alpha_test(const AlphaTestAttrib *attrib);
|
||||
virtual void issue_depth_test(const DepthTestAttrib *attrib);
|
||||
virtual void issue_depth_write(const DepthWriteAttrib *attrib);
|
||||
virtual void issue_cull_face(const CullFaceAttrib *attrib);
|
||||
virtual void issue_fog(const FogAttrib *attrib);
|
||||
virtual void issue_depth_offset(const DepthOffsetAttrib *attrib);
|
||||
virtual void apply_fog(Fog *fog);
|
||||
|
||||
virtual void bind_light(PointLight *light_obj, const NodePath &light,
|
||||
int light_id);
|
||||
@@ -119,244 +91,146 @@ public:
|
||||
virtual void bind_light(Spotlight *light_obj, const NodePath &light,
|
||||
int light_id);
|
||||
|
||||
//virtual bool begin_frame();
|
||||
virtual bool begin_scene();
|
||||
virtual void end_scene();
|
||||
virtual void end_frame();
|
||||
INLINE static DWORD Colorf_to_D3DCOLOR(const Colorf &cColorf);
|
||||
|
||||
virtual bool wants_texcoords() const;
|
||||
|
||||
virtual void set_color_clear_value(const Colorf& value);
|
||||
|
||||
public:
|
||||
// recreate_tex_callback needs pDD,pD3DDevice to be public
|
||||
DXScreenData *_pScrn;
|
||||
LPDIRECT3DDEVICE7 _pD3DDevice; // cache copy of _pScrn->pD3DDevice, just for speedier access
|
||||
|
||||
#ifndef USE_TEXFMTVEC
|
||||
LPDDPIXELFORMAT _pTexPixFmts;
|
||||
int _cNumTexPixFmts;
|
||||
#endif
|
||||
virtual void set_state_and_transform(const RenderState *state,
|
||||
const TransformState *transform);
|
||||
|
||||
protected:
|
||||
void do_issue_transform();
|
||||
void do_issue_alpha_test();
|
||||
void do_issue_render_mode();
|
||||
void do_issue_rescale_normal();
|
||||
void do_issue_color_write();
|
||||
void do_issue_depth_test();
|
||||
void do_issue_depth_write();
|
||||
void do_issue_cull_face();
|
||||
void do_issue_fog();
|
||||
void do_issue_depth_offset();
|
||||
void do_issue_tex_gen();
|
||||
void do_issue_shade_model();
|
||||
void do_issue_material();
|
||||
void do_issue_texture();
|
||||
void do_issue_blending();
|
||||
|
||||
virtual void enable_lighting(bool enable);
|
||||
virtual void set_ambient_light(const Colorf &color);
|
||||
virtual void enable_light(int light_id, bool enable);
|
||||
|
||||
virtual bool slot_new_clip_plane(int plane_id);
|
||||
virtual void enable_clip_plane(int plane_id, bool enable);
|
||||
virtual void bind_clip_plane(const NodePath &plane, int plane_id);
|
||||
|
||||
virtual void set_blend_mode();
|
||||
|
||||
void free_pointers(); // free local internal buffers
|
||||
void free_dxgsg_objects(); // free the DirectX objects we create
|
||||
void free_nondx_resources();
|
||||
void free_d3d_device();
|
||||
|
||||
void set_draw_buffer(const RenderBuffer &rb);
|
||||
void set_read_buffer(const RenderBuffer &rb);
|
||||
|
||||
// for storage of the flexible vertex format
|
||||
BYTE *_pCurFvfBufPtr,*_pFvfBufBasePtr;
|
||||
INLINE void add_to_FVFBuf(void *data, size_t bytes) ;
|
||||
WORD *_index_buf; // base of malloced array
|
||||
void do_auto_rescale_normal();
|
||||
|
||||
bool _dx_ready;
|
||||
HRESULT _last_testcooplevel_result;
|
||||
protected:
|
||||
INLINE static D3DTEXTUREADDRESS get_texture_wrap_mode(Texture::WrapMode wm);
|
||||
INLINE static D3DFOGMODE get_fog_mode_type(Fog::Mode m);
|
||||
const D3DCOLORVALUE &get_light_color(Light *light) const;
|
||||
INLINE static D3DTRANSFORMSTATETYPE get_tex_mat_sym(int stage_index);
|
||||
|
||||
HDC _front_hdc;
|
||||
DXTextureContext7 *_pCurTexContext;
|
||||
static D3DBLEND get_blend_func(ColorBlendAttrib::Operand operand);
|
||||
void report_texmgr_stats();
|
||||
|
||||
bool _bTransformIssued; // decaling needs to tell when a transform has been issued
|
||||
D3DMATRIX _SavedTransform;
|
||||
void set_context(DXScreenData *new_context);
|
||||
void set_render_target();
|
||||
|
||||
void set_texture_blend_mode(int i, const TextureStage *stage);
|
||||
|
||||
void dx_cleanup();
|
||||
|
||||
bool check_cooperative_level();
|
||||
|
||||
void show_frame();
|
||||
void show_full_screen_frame();
|
||||
void show_windowed_frame();
|
||||
|
||||
void copy_pres_reset(DXScreenData *new_context);
|
||||
|
||||
static D3DTEXTUREMINFILTER get_d3d_min_type(Texture::FilterType filter_type);
|
||||
static D3DTEXTUREMIPFILTER get_d3d_mip_type(Texture::FilterType filter_type);
|
||||
static D3DTEXTUREOP get_texture_operation(TextureStage::CombineMode mode, int scale);
|
||||
static DWORD get_texture_argument(TextureStage::CombineSource source,
|
||||
TextureStage::CombineOperand operand);
|
||||
static DWORD get_texture_argument_modifier(TextureStage::CombineOperand operand);
|
||||
|
||||
static HRESULT CALLBACK enum_tex_formats_callback(LPDDPIXELFORMAT pddpf, void *param);
|
||||
|
||||
protected:
|
||||
DXScreenData *_screen;
|
||||
LPDIRECT3DDEVICE7 _d3d_device; // same as _screen->_d3d_device, cached for spd
|
||||
|
||||
bool _dx_is_ready;
|
||||
HRESULT _last_testcooplevel_result;
|
||||
|
||||
bool _vertex_blending_enabled;
|
||||
|
||||
RenderBuffer::Type _cur_read_pixel_buffer; // source for copy_pixel_buffer operation
|
||||
bool _auto_rescale_normal;
|
||||
|
||||
void GenerateSphere(void *pVertexSpace,DWORD dwVertSpaceByteSize,
|
||||
void *pIndexSpace,DWORD dwIndexSpaceByteSize,
|
||||
D3DVECTOR *pCenter, float fRadius,
|
||||
DWORD wNumRings, DWORD wNumSections, float sx, float sy, float sz,
|
||||
DWORD *pNumVertices,DWORD *pNumIndices,DWORD fvfFlags,DWORD dwVertSize);
|
||||
HRESULT RestoreAllVideoSurfaces();
|
||||
HRESULT RecreateAllVideoSurfaces();
|
||||
HRESULT DeleteAllVideoSurfaces();
|
||||
|
||||
/*
|
||||
INLINE void enable_multisample_alpha_one(bool val);
|
||||
INLINE void enable_multisample_alpha_mask(bool val);
|
||||
INLINE void enable_multisample(bool val);
|
||||
*/
|
||||
|
||||
INLINE void enable_color_material(bool val);
|
||||
INLINE void enable_fog(bool val);
|
||||
INLINE void enable_zwritemask(bool val);
|
||||
INLINE void set_shademode(D3DSHADEMODE val);
|
||||
|
||||
D3DTEXTUREADDRESS get_texture_wrap_mode(Texture::WrapMode wm) const;
|
||||
D3DFOGMODE get_fog_mode_type(Fog::Mode m) const;
|
||||
|
||||
void do_auto_rescale_normal();
|
||||
|
||||
INLINE void enable_primitive_clipping(bool val);
|
||||
INLINE void enable_alpha_test(bool val);
|
||||
INLINE void enable_line_smooth(bool val);
|
||||
INLINE void enable_blend(bool val);
|
||||
INLINE void enable_point_smooth(bool val);
|
||||
INLINE void enable_texturing(bool val);
|
||||
INLINE void call_dxLightModelAmbient(const Colorf& color);
|
||||
INLINE void call_dxAlphaFunc(D3DCMPFUNC func, float ref);
|
||||
INLINE void call_dxBlendFunc(D3DBLEND sfunc, D3DBLEND dfunc);
|
||||
static D3DBLEND get_blend_func(ColorBlendAttrib::Operand operand);
|
||||
INLINE void enable_dither(bool val);
|
||||
INLINE void enable_stencil_test(bool val);
|
||||
void report_texmgr_stats();
|
||||
void draw_multitri(Geom *geom, D3DPRIMITIVETYPE tri_id);
|
||||
void set_context(DXScreenData *pNewContextData);
|
||||
|
||||
void draw_prim_inner_loop(int nVerts, const Geom *geom, ushort perFlags);
|
||||
void draw_prim_inner_loop_coordtexonly(int nVerts, const Geom *geom);
|
||||
size_t draw_prim_setup(const Geom *geom) ;
|
||||
|
||||
// for drawing primitives
|
||||
Normalf p_normal; // still used to hold G_OVERALL, G_PER_PRIM values
|
||||
TexCoordf p_texcoord;
|
||||
D3DCOLOR _curD3Dcolor;
|
||||
DWORD _curFVFflags;
|
||||
DWORD _perPrim,_perVertex,_perComp; // these hold DrawLoopFlags bitmask values
|
||||
|
||||
D3DCOLOR _scene_graph_color_D3DCOLOR;
|
||||
D3DCOLOR _d3dcolor_clear_value;
|
||||
D3DSHADEMODE _CurShadeMode;
|
||||
UINT _color_writemask;
|
||||
|
||||
bool _bDrawPrimDoSetupVertexBuffer; // if true, draw methods just copy vertex data into pCurrentGeomContext
|
||||
|
||||
// iterators for primitives
|
||||
Geom::VertexIterator vi;
|
||||
Geom::NormalIterator ni;
|
||||
Geom::TexCoordIterator ti;
|
||||
Geom::ColorIterator ci;
|
||||
|
||||
// these are used for fastpaths that bypass the iterators above
|
||||
// pointers to arrays in current geom, used to traverse indexed and non-indexed arrays
|
||||
Vertexf *_coord_array,*_pCurCoord;
|
||||
ushort *_coordindex_array,*_pCurCoordIndex;
|
||||
|
||||
TexCoordf *_texcoord_array,*_pCurTexCoord;
|
||||
ushort *_texcoordindex_array,*_pCurTexCoordIndex;
|
||||
|
||||
/*
|
||||
PTA_Normalf _norms;
|
||||
PTA_Colorf _colors;
|
||||
PTA_ushort _cindexes,_nindexes;
|
||||
*/
|
||||
|
||||
Colorf _lmodel_ambient;
|
||||
float _material_ambient;
|
||||
float _material_diffuse;
|
||||
float _material_specular;
|
||||
float _material_shininess;
|
||||
float _material_emission;
|
||||
|
||||
typedef enum {None,
|
||||
PerVertexFog=D3DRENDERSTATE_FOGVERTEXMODE,
|
||||
PerPixelFog=D3DRENDERSTATE_FOGTABLEMODE
|
||||
} DxgsgFogType;
|
||||
DxgsgFogType _doFogType;
|
||||
bool _fog_enabled;
|
||||
/*
|
||||
TODO: cache fog state
|
||||
float _fog_start,_fog_end,_fog_density,float _fog_color;
|
||||
*/
|
||||
float _alpha_func_refval;
|
||||
D3DCMPFUNC _alpha_func;
|
||||
enum DxgsgFogType {
|
||||
None,
|
||||
PerVertexFog=D3DRENDERSTATE_FOGVERTEXMODE,
|
||||
PerPixelFog=D3DRENDERSTATE_FOGTABLEMODE
|
||||
};
|
||||
DxgsgFogType _do_fog_type;
|
||||
|
||||
D3DBLEND _blend_source_func;
|
||||
D3DBLEND _blend_dest_func;
|
||||
|
||||
bool _line_smooth_enabled;
|
||||
bool* _light_enabled; // bool[_max_lights]
|
||||
bool _color_material_enabled;
|
||||
bool _texturing_enabled;
|
||||
bool _clipping_enabled;
|
||||
bool _dither_enabled;
|
||||
bool _stencil_test_enabled;
|
||||
bool _blend_enabled;
|
||||
bool _depth_test_enabled;
|
||||
bool _depth_write_enabled;
|
||||
bool _alpha_test_enabled;
|
||||
DWORD _clip_plane_bits;
|
||||
CullFaceAttrib::Mode _cull_face_mode;
|
||||
RenderModeAttrib::Mode _current_fill_mode; //point/wireframe/solid
|
||||
|
||||
RenderModeAttrib::Mode _current_fill_mode; //poinr/wireframe/solid
|
||||
// GraphicsChannel *_panda_gfx_channel; // cache the 1 channel dx supports
|
||||
|
||||
// Cur Texture State
|
||||
TextureStage::Mode _CurTexBlendMode;
|
||||
D3DTEXTUREMAGFILTER _CurTexMagFilter;
|
||||
D3DTEXTUREMINFILTER _CurTexMinFilter;
|
||||
D3DTEXTUREMIPFILTER _CurTexMipFilter;
|
||||
DWORD _CurTexAnisoDegree;
|
||||
Texture::WrapMode _CurTexWrapModeU,_CurTexWrapModeV;
|
||||
|
||||
LMatrix4f _current_projection_mat;
|
||||
int _projection_mat_stack_count;
|
||||
LMatrix4f _projection_mat;
|
||||
|
||||
CPT(DisplayRegion) _actual_display_region;
|
||||
const DXVertexBufferContext7 *_active_vbuffer;
|
||||
const DXIndexBufferContext7 *_active_ibuffer;
|
||||
|
||||
// Color/Alpha Matrix Transition stuff
|
||||
INLINE void transform_color(Colorf &InColor,D3DCOLOR &OutColor);
|
||||
bool _tex_stats_retrieval_impossible;
|
||||
|
||||
bool _overlay_windows_supported;
|
||||
int _fvf;
|
||||
LPDDPIXELFORMAT _tex_formats;
|
||||
int _num_tex_formats;
|
||||
|
||||
#if 0
|
||||
// This is here just as a temporary hack so this file will still
|
||||
// compile. However, it is never initialized and will certainly
|
||||
// cause the code to crash when it is referenced. (This used to be
|
||||
// inherited from the base class, but the new design requires that a
|
||||
// GSG may be used for multiple windows, so it doesn't make sense to
|
||||
// store a window pointer any more.)
|
||||
GraphicsWindow *_win;
|
||||
#endif
|
||||
static D3DMATRIX _d3d_ident_mat;
|
||||
|
||||
public:
|
||||
static GraphicsStateGuardian*
|
||||
make_DXGraphicsStateGuardian(const FactoryParams ¶ms);
|
||||
|
||||
static TypeHandle get_class_type();
|
||||
static void init_type();
|
||||
virtual TypeHandle get_type() const;
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||||
// INLINE void Set_HDC(HDC hdc) { _front_hdc = hdc; }
|
||||
void adjust_view_rect(int x, int y);
|
||||
INLINE void SetDXReady(bool stat) { _dx_ready = stat; }
|
||||
INLINE bool GetDXReady() { return _dx_ready;}
|
||||
void DXGraphicsStateGuardian7::SetTextureBlendMode(TextureStage::Mode TexBlendMode,bool bJustEnable);
|
||||
|
||||
void dx_cleanup(bool bRestoreDisplayMode,bool bAtExitFnCalled);
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
|
||||
#define DO_REACTIVATE_WINDOW true
|
||||
bool CheckCooperativeLevel(bool bDoReactivateWindow = false);
|
||||
|
||||
void dx_setup_after_resize(RECT *pViewRect);
|
||||
void show_frame();
|
||||
void show_full_screen_frame();
|
||||
void show_windowed_frame();
|
||||
|
||||
void support_overlay_window(bool flag);
|
||||
|
||||
|
||||
/* void dx_init( LPDIRECTDRAW7 context,
|
||||
LPDIRECTDRAWSURFACE7 pri,
|
||||
LPDIRECTDRAWSURFACE7 back,
|
||||
LPDIRECTDRAWSURFACE7 zbuf,
|
||||
LPDIRECT3D7 d3d,
|
||||
LPDIRECT3DDEVICE7 d3dDevice,
|
||||
RECT viewrect); */
|
||||
void dx_init();
|
||||
|
||||
friend HRESULT CALLBACK EnumTexFmtsCallback( LPDDPIXELFORMAT pddpf, VOID* param );
|
||||
public:
|
||||
static void init_type() {
|
||||
GraphicsStateGuardian::init_type();
|
||||
register_type(_type_handle, "DXGraphicsStateGuardian7",
|
||||
GraphicsStateGuardian::get_class_type());
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
|
||||
friend class wdxGraphicsWindow7;
|
||||
friend class wdxGraphicsPipe7;
|
||||
friend class wdxGraphicsWindowGroup7;
|
||||
friend class DXTextureContext7;
|
||||
};
|
||||
|
||||
#include "dxGraphicsStateGuardian7.I"
|
||||
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
// Filename: dxTextureContext7.I
|
||||
// Created by: drose (26Oct05)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d-general@lists.sourceforge.net .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: DXTextureContext7::has_mipmaps
|
||||
// Access: Public
|
||||
// Description: Returns true if the texture was created with mipmaps,
|
||||
// false otherwise.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool DXTextureContext7::
|
||||
has_mipmaps() const {
|
||||
return _has_mipmaps;
|
||||
}
|
||||
@@ -214,7 +214,7 @@ HRESULT ConvertPixBuftoDDSurf(ConversionType ConvNeeded,BYTE *pbuf,LPDIRECTDRAWS
|
||||
}
|
||||
|
||||
if(FAILED( hr = pDDSurf->Lock( NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL ))) {
|
||||
dxgsg7_cat.error() << "CreateTexture failed: _surface->Lock() failed on texture! hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
dxgsg7_cat.error() << "create_texture failed: _surface->Lock() failed on texture! hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -331,7 +331,7 @@ HRESULT ConvertPixBuftoDDSurf(ConversionType ConvNeeded,BYTE *pbuf,LPDIRECTDRAWS
|
||||
|
||||
for(DWORD y=0; y<dwOrigHeight; y++,pDDSurfBytes+=ddsd.lPitch) {
|
||||
pDstWord = (WORD*)pDDSurfBytes;
|
||||
|
||||
|
||||
for(DWORD x=0; x<dwOrigWidth; x++,pSrcWord++,pDstWord++) {
|
||||
BYTE r,g,b,a;
|
||||
DWORD dwPixel = *pSrcWord;
|
||||
@@ -662,7 +662,7 @@ HRESULT ConvertPixBuftoDDSurf(ConversionType ConvNeeded,BYTE *pbuf,LPDIRECTDRAWS
|
||||
}
|
||||
|
||||
default:
|
||||
dxgsg7_cat.error() << "CreateTexture failed! unhandled texture conversion type: "<< ConvNeeded <<" \n";
|
||||
dxgsg7_cat.error() << "create_texture failed! unhandled texture conversion type: "<< ConvNeeded <<" \n";
|
||||
pDDSurf->Unlock(NULL);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
@@ -1001,12 +1001,8 @@ HRESULT ConvertDDSurftoPixBuf(Texture *pixbuf,LPDIRECTDRAWSURFACE7 pDDSurf) {
|
||||
// gets the attributes of the texture from the bitmap, creates the
|
||||
// texture, and then copies the bitmap into the texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice,
|
||||
#ifdef USE_TEXFMTVEC
|
||||
DDPixelFormatVec &TexFmts,LPD3DDEVICEDESC7 pD3DDevDesc)
|
||||
#else
|
||||
LPDIRECTDRAWSURFACE7 DXTextureContext7::create_texture(LPDIRECT3DDEVICE7 pd3dDevice,
|
||||
int cNumTexPixFmts, DDPIXELFORMAT *pTexFmts,LPD3DDEVICEDESC7 pD3DDevDesc)
|
||||
#endif
|
||||
{
|
||||
HRESULT hr;
|
||||
int i,cNumAlphaBits; // number of alpha bits in texture pixfmt
|
||||
@@ -1016,21 +1012,16 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
ConversionType ConvNeeded;
|
||||
|
||||
assert(_texture!=NULL);
|
||||
delete_texture();
|
||||
clear_dirty_flags(Texture::DF_image | Texture::DF_mipmap);
|
||||
|
||||
#ifdef USE_TEXFMTVEC
|
||||
int cNumTexPixFmts=TexturePixelFormats.size();
|
||||
#endif
|
||||
DDPIXELFORMAT *pTexPixFmts = new DDPIXELFORMAT[cNumTexPixFmts];
|
||||
|
||||
// make local copy of array so I can muck with it during searches for this texture fmt
|
||||
// (such as marking pixfmts that no search will be interested in)
|
||||
// probably should do this faster way
|
||||
|
||||
#ifdef USE_TEXFMTVEC
|
||||
memcpy(pTexPixFmts,&TexturePixelFormats[0],cNumTexPixFmts*sizeof(DDPIXELFORMAT));
|
||||
#else
|
||||
memcpy(pTexPixFmts,pTexFmts,cNumTexPixFmts*sizeof(DDPIXELFORMAT));
|
||||
#endif
|
||||
|
||||
// bpp indicates requested fmt, not pixbuf fmt
|
||||
DWORD bpp = get_bits_per_pixel(_texture->get_format(), &cNumAlphaBits);
|
||||
@@ -1160,10 +1151,10 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
LPDDPIXELFORMAT pCurPixFmt;
|
||||
char *szErrorMsg;
|
||||
|
||||
szErrorMsg = "CreateTexture failed: couldn't find compatible Tex DDPIXELFORMAT!\n";
|
||||
szErrorMsg = "create_texture failed: couldn't find compatible Tex DDPIXELFORMAT!\n";
|
||||
|
||||
if(dxgsg7_cat.is_spam())
|
||||
dxgsg7_cat.spam() << "CreateTexture handling bitdepth: " << bpp << " alphabits: " << cNumAlphaBits << "\n";
|
||||
dxgsg7_cat.spam() << "create_texture handling bitdepth: " << bpp << " alphabits: " << cNumAlphaBits << "\n";
|
||||
|
||||
// Mark formats I dont want to deal with
|
||||
for(i=0,pCurPixFmt=pTexPixFmts;i<cNumTexPixFmts;i++,pCurPixFmt++) {
|
||||
@@ -1244,7 +1235,7 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
|
||||
// at this point, bail. dont worry about converting to non-alpha formats yet,
|
||||
// I think this will be a very rare case
|
||||
szErrorMsg = "CreateTexture failed: couldn't find compatible Tex DDPIXELFORMAT! no available 16 or 32-bit alpha formats!\n";
|
||||
szErrorMsg = "create_texture failed: couldn't find compatible Tex DDPIXELFORMAT! no available 16 or 32-bit alpha formats!\n";
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1466,7 +1457,7 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
break;
|
||||
|
||||
default:
|
||||
szErrorMsg = "CreateTexture failed: unhandled pixel bitdepth in DX loader";
|
||||
szErrorMsg = "create_texture failed: unhandled pixel bitdepth in DX loader";
|
||||
}
|
||||
|
||||
// if we've gotten here, haven't found a match
|
||||
@@ -1509,13 +1500,14 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
else ft=Texture::FT_linear;
|
||||
}
|
||||
|
||||
if((ft==Texture::FT_linear) && !(pD3DDevDesc->dpcTriCaps.dwTextureFilterCaps & D3DPTFILTERCAPS_LINEAR))
|
||||
if((ft==Texture::FT_linear) && !(pD3DDevDesc->dpcTriCaps.dwTextureFilterCaps & D3DPTFILTERCAPS_LINEAR)) {
|
||||
ft=Texture::FT_nearest;
|
||||
}
|
||||
_tex->set_magfilter(ft);
|
||||
|
||||
// figure out if we are mipmapping this texture
|
||||
ft =_tex->get_minfilter();
|
||||
_bHasMipMaps=FALSE;
|
||||
_has_mipmaps=FALSE;
|
||||
|
||||
if(!dx_ignore_mipmaps) { // set if no HW mipmap capable
|
||||
switch(ft) {
|
||||
@@ -1523,11 +1515,11 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
case Texture::FT_linear_mipmap_nearest:
|
||||
case Texture::FT_nearest_mipmap_linear: // pick nearest in each, interpolate linearly b/w them
|
||||
case Texture::FT_linear_mipmap_linear:
|
||||
_bHasMipMaps=TRUE;
|
||||
_has_mipmaps=TRUE;
|
||||
}
|
||||
|
||||
if(dx_mipmap_everything) { // debug toggle, ok to leave in since its just a creation cost
|
||||
_bHasMipMaps=TRUE;
|
||||
_has_mipmaps=TRUE;
|
||||
if(ft != Texture::FT_linear_mipmap_linear) {
|
||||
dxgsg7_cat.spam() << "Forcing mipmap filtering on DX texture [" << _tex->get_name() << "]\n";
|
||||
}
|
||||
@@ -1582,14 +1574,14 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
}
|
||||
_tex->set_anisotropic_degree(aniso_degree);
|
||||
#ifdef _DEBUG
|
||||
dxgsg7_cat.spam() << "CreateTexture: setting aniso degree for "<< _tex->get_name() << " to: " << aniso_degree << endl;
|
||||
dxgsg7_cat.spam() << "create_texture: setting aniso degree for "<< _tex->get_name() << " to: " << aniso_degree << endl;
|
||||
#endif
|
||||
|
||||
if(_bHasMipMaps) {
|
||||
if(_has_mipmaps) {
|
||||
// We dont specify mipmapcount, so CreateSurface will auto-create surfs
|
||||
// for all mipmaps down to 1x1 (if driver supports deep-mipmaps, otherwise Nx1)
|
||||
ddsd.ddsCaps.dwCaps |= (DDSCAPS_MIPMAP | DDSCAPS_COMPLEX);
|
||||
dxgsg7_cat.debug() << "CreateTexture: generating mipmaps for "<< _tex->get_name() << endl;
|
||||
dxgsg7_cat.debug() << "create_texture: generating mipmaps for "<< _tex->get_name() << endl;
|
||||
}
|
||||
|
||||
if(pD3DDevDesc->dwDevCaps & D3DDEVCAPS_SEPARATETEXTUREMEMORIES) {
|
||||
@@ -1599,17 +1591,15 @@ LPDIRECTDRAWSURFACE7 DXTextureContext7::CreateTexture(LPDIRECT3DDEVICE7 pd3dDevi
|
||||
ddsd.dwFlags |= DDSD_TEXTURESTAGE;
|
||||
}
|
||||
|
||||
PRINTVIDMEM(pDD,&ddsd.ddsCaps,"texture surf (includes AGP mem)");
|
||||
|
||||
// Create a new surface for the texture
|
||||
if(FAILED( hr = pDD->CreateSurface( &ddsd, &_surface, NULL ) )) {
|
||||
dxgsg7_cat.error() << "CreateTexture failed: pDD->CreateSurface() failed! hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
dxgsg7_cat.error() << "create_texture failed: pDD->CreateSurface() failed! hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
dxgsg7_cat.debug() << "CreateTexture: "<< _tex->get_name() <<" converted " << ConvNameStrs[ConvNeeded] << " \n";
|
||||
dxgsg7_cat.debug() << "create_texture: "<< _tex->get_name() <<" converted " << ConvNameStrs[ConvNeeded] << " \n";
|
||||
#endif
|
||||
|
||||
_PixBufConversionType=ConvNeeded;
|
||||
@@ -1661,7 +1651,7 @@ FillDDSurfTexturePixels() {
|
||||
|
||||
CPTA_uchar orig_image = _texture->get_ram_image();
|
||||
if (orig_image.empty()) {
|
||||
dxgsg7_cat.fatal() << "CreateTexture: get_ram_image() failed\n";
|
||||
dxgsg7_cat.fatal() << "create_texture: get_ram_image() failed\n";
|
||||
// The texture doesn't have an image to load.
|
||||
return E_FAIL;
|
||||
}
|
||||
@@ -1682,7 +1672,7 @@ FillDDSurfTexturePixels() {
|
||||
|
||||
_surface->GetSurfaceDesc(&ddsd);
|
||||
|
||||
if(_bHasMipMaps) {
|
||||
if(_has_mipmaps) {
|
||||
DWORD i,oldcurxsize,oldcurysize,curxsize,curysize,cMipMapCount=ddsd.dwMipMapCount;
|
||||
assert(ddsd.dwMipMapCount<20);
|
||||
|
||||
@@ -1771,7 +1761,7 @@ FillDDSurfTexturePixels() {
|
||||
|
||||
hr = pCurDDSurf->GetAttachedSurface(&ddsCaps, &pMipLevel_DDSurf);
|
||||
if(FAILED(hr)) {
|
||||
dxgsg7_cat.error() << "CreateTexture failed creating mipmaps: GetAttachedSurf hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
dxgsg7_cat.error() << "create_texture failed creating mipmaps: GetAttachedSurf hr = " << ConvD3DErrorToString(hr) << "\n";
|
||||
delete [] pMipMapPixBufSpace;
|
||||
pCurDDSurf->Release();
|
||||
return hr;
|
||||
@@ -1799,7 +1789,7 @@ FillDDSurfTexturePixels() {
|
||||
if(dx_debug_view_mipmaps) {
|
||||
#if 0
|
||||
if(!(ddcaps.dwCaps & DDCAPS_BLTSTRETCH)) {
|
||||
dxgsg7_cat.error() << "CreateTexture failed debug-viewing mipmaps, BLT stretching not supported! ( we need to do SW stretch) \n";
|
||||
dxgsg7_cat.error() << "create_texture failed debug-viewing mipmaps, BLT stretching not supported! ( we need to do SW stretch) \n";
|
||||
return hr;
|
||||
}
|
||||
#endif
|
||||
@@ -1917,13 +1907,11 @@ FillDDSurfTexturePixels() {
|
||||
// Desc: Release the surface used to store the texture
|
||||
//-----------------------------------------------------------------------------
|
||||
void DXTextureContext7::
|
||||
DeleteTexture( ) {
|
||||
delete_texture( ) {
|
||||
if(dxgsg7_cat.is_spam()) {
|
||||
dxgsg7_cat.spam() << "Deleting DX texture for " << _tex->get_name() << "\n";
|
||||
}
|
||||
|
||||
ULONG refcnt;
|
||||
|
||||
#ifdef DEBUG_RELEASES
|
||||
if(_surface) {
|
||||
LPDIRECTDRAW7 pDD;
|
||||
@@ -1954,13 +1942,13 @@ TextureContext(tex) {
|
||||
}
|
||||
//#endif
|
||||
_surface = NULL;
|
||||
_bHasMipMaps = FALSE;
|
||||
_has_mipmaps = FALSE;
|
||||
_tex = tex;
|
||||
}
|
||||
|
||||
DXTextureContext7::
|
||||
~DXTextureContext7() {
|
||||
DeleteTexture();
|
||||
delete_texture();
|
||||
TextureContext::~TextureContext();
|
||||
_tex = NULL;
|
||||
}
|
||||
|
||||
@@ -41,17 +41,14 @@ public:
|
||||
|
||||
// static is_unused_texpixelformat(DDPIXELFORMAT *)
|
||||
|
||||
#ifdef USE_TEXFMTVEC
|
||||
LPDIRECTDRAWSURFACE7 CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, DDPixelFormatVec &TexFmts,LPD3DDEVICEDESC7 pD3DDevDesc);
|
||||
#else
|
||||
LPDIRECTDRAWSURFACE7 CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, DDPIXELFORMAT *pTexFmts,LPD3DDEVICEDESC7 pD3DDevDesc);
|
||||
#endif
|
||||
LPDIRECTDRAWSURFACE7 create_texture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, DDPIXELFORMAT *pTexFmts,LPD3DDEVICEDESC7 pD3DDevDesc);
|
||||
void delete_texture();
|
||||
|
||||
bool _bHasMipMaps;
|
||||
INLINE bool has_mipmaps() const;
|
||||
|
||||
bool _has_mipmaps;
|
||||
DWORD _PixBufConversionType; // enum ConversionType
|
||||
|
||||
// must be public since called from global callback fns
|
||||
void DeleteTexture();
|
||||
HRESULT FillDDSurfTexturePixels();
|
||||
|
||||
protected:
|
||||
@@ -75,6 +72,7 @@ private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "dxTextureContext7.I"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "dxgsg7base.h"
|
||||
#include "dxgsg7base.cxx"
|
||||
#include "config_dxgsg7.cxx"
|
||||
#include "dxGeomMunger7.cxx"
|
||||
#include "dxTextureContext7.cxx"
|
||||
#include "wdxGraphicsPipe7.cxx"
|
||||
#include "wdxGraphicsWindow7.cxx"
|
||||
|
||||
@@ -38,17 +38,12 @@
|
||||
#error DX7 headers not available, you need to install MS Platform SDK or DirectX 8+ SDK!
|
||||
#endif
|
||||
|
||||
#define D3DERRORSTRING(HRESULT) " at (" << __FILE__ << ":" << __LINE__ << "), hr=" << ConvD3DErrorToString(HRESULT) << endl
|
||||
|
||||
// disable nameless struct 'warning'
|
||||
#pragma warning (disable : 4201)
|
||||
|
||||
//#define USE_TEXFMTVEC
|
||||
// USE_TEXFMTVEC caused crash on dealloc
|
||||
|
||||
#ifdef USE_TEXFMTVEC
|
||||
typedef pvector<DDPIXELFORMAT> DDPixelFormatVec;
|
||||
#else
|
||||
#define MAX_DX_TEXPIXFMTS 20 // should be enough for any card
|
||||
#endif
|
||||
|
||||
#define ISPOW2(X) (((X) & ((X)-1))==0)
|
||||
|
||||
@@ -69,7 +64,8 @@ typedef pvector<DDPIXELFORMAT> DDPixelFormatVec;
|
||||
#define DEBUG_RELEASES
|
||||
|
||||
#ifdef DEBUG_RELEASES
|
||||
#define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero) \
|
||||
#define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero) { \
|
||||
ULONG refcnt; \
|
||||
if(((OBJECT)!=NULL)&&(!IsBadWritePtr((OBJECT),4))) { \
|
||||
refcnt = (OBJECT)->Release(); \
|
||||
MODULE##_cat.debug() << DBGSTR << " released, refcnt = " << refcnt << endl; \
|
||||
@@ -82,11 +78,12 @@ typedef pvector<DDPIXELFORMAT> DDPixelFormatVec;
|
||||
(OBJECT) = NULL; \
|
||||
} else { \
|
||||
MODULE##_cat.debug() << DBGSTR << " not released, ptr == NULL" << endl; \
|
||||
}
|
||||
} }
|
||||
|
||||
#define PRINTREFCNT(OBJECT,STR) { (OBJECT)->AddRef(); dxgsg7_cat.debug() << STR << " refcnt = " << (OBJECT)->Release() << endl; }
|
||||
#else
|
||||
#define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero) \
|
||||
#define RELEASE(OBJECT,MODULE,DBGSTR,bDoDownToZero) { \
|
||||
ULONG refcnt; \
|
||||
if(((OBJECT)!=NULL)&&(!IsBadWritePtr((OBJECT),4))) { \
|
||||
refcnt=(OBJECT)->Release(); \
|
||||
if((bDoDownToZero) && (refcnt>0)) { \
|
||||
@@ -96,7 +93,7 @@ typedef pvector<DDPIXELFORMAT> DDPixelFormatVec;
|
||||
} while(refcnt>0); \
|
||||
} \
|
||||
(OBJECT) = NULL; \
|
||||
}
|
||||
} }
|
||||
|
||||
#define PRINTREFCNT(OBJECT,STR)
|
||||
#endif
|
||||
@@ -127,9 +124,6 @@ typedef struct {
|
||||
WORD CardIDNum; // its posn in DisplayArray, for dbgprint purposes
|
||||
DDDEVICEIDENTIFIER2 DXDeviceID;
|
||||
D3DDEVICEDESC7 D3DDevDesc;
|
||||
#ifdef USE_TEXFMTVEC
|
||||
DDPixelFormatVec TexPixFmts;
|
||||
#endif
|
||||
} DXScreenData;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -174,37 +174,11 @@ open_window() {
|
||||
set_coop_levels_and_display_modes();
|
||||
create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer);
|
||||
|
||||
make_current();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: wdxGraphicsWindow7::make_gsg
|
||||
// Access: Public, Virtual
|
||||
// Description: Creates a new GSG for the window and stores it in the
|
||||
// _gsg pointer. This should only be called from within
|
||||
// the draw thread.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void wdxGraphicsWindow7::
|
||||
make_gsg() {
|
||||
nassertv(_gsg == (GraphicsStateGuardian *)NULL);
|
||||
_dxgsg = new DXGraphicsStateGuardian7(this);
|
||||
_gsg = _dxgsg;
|
||||
// Tell the associated dxGSG about the window handle.
|
||||
_wcontext.hWnd = _hWnd;
|
||||
|
||||
if (!choose_device(0, NULL)) {
|
||||
wdxdisplay7_cat.error()
|
||||
<< "Unable to find suitable rendering device.\n";
|
||||
release_gsg();
|
||||
return;
|
||||
}
|
||||
|
||||
set_coop_levels_and_display_modes();
|
||||
create_screen_buffers_and_device(_dxgsg->scrn, dx_force_16bpp_zbuffer);
|
||||
}
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: wdxGraphicsWindow7::end_flip
|
||||
// Access: Public, Virtual
|
||||
@@ -284,18 +258,13 @@ handle_reshape() {
|
||||
return;
|
||||
}
|
||||
|
||||
_dxgsg->RestoreAllVideoSurfaces();
|
||||
_dxgsg->release_all();
|
||||
|
||||
set_to_temp_rendertarget();
|
||||
|
||||
// create the new resized rendertargets
|
||||
//RECT view_rect;
|
||||
//get_client_rect_screen(hWnd, &view_rect);
|
||||
//_dxgsg->dx_setup_after_resize(view_rect, &_wcontext);
|
||||
|
||||
RECT view_rect;
|
||||
get_client_rect_screen(_wcontext.hWnd, &view_rect);
|
||||
_dxgsg->dx_setup_after_resize(&view_rect);
|
||||
// _dxgsg->dx_setup_after_resize(&view_rect);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -307,7 +276,7 @@ handle_reshape() {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool wdxGraphicsWindow7::
|
||||
do_fullscreen_resize(int x_size, int y_size) {
|
||||
_dxgsg->SetDXReady(false);
|
||||
// _dxgsg->SetDXReady(false);
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
@@ -379,7 +348,7 @@ do_fullscreen_resize(int x_size, int y_size) {
|
||||
return false;
|
||||
}
|
||||
|
||||
_dxgsg->free_dxgsg_objects();
|
||||
// _dxgsg->free_dxgsg_objects();
|
||||
|
||||
// let driver choose default refresh rate (hopefully its >=60Hz)
|
||||
hr = _wcontext.pDD->SetDisplayMode(x_size, y_size, dwFullScreenBitDepth,
|
||||
@@ -405,28 +374,11 @@ do_fullscreen_resize(int x_size, int y_size) {
|
||||
_wcontext.dwRenderHeight = y_size;
|
||||
|
||||
create_screen_buffers_and_device(_wcontext, dx_force_16bpp_zbuffer);
|
||||
_dxgsg->RecreateAllVideoSurfaces();
|
||||
_dxgsg->SetDXReady(true);
|
||||
_dxgsg->release_all();
|
||||
// _dxgsg->SetDXReady(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: wdxGraphicsWindow7::support_overlay_window
|
||||
// Access: Protected, Virtual
|
||||
// Description: Some windows graphics contexts (e.g. DirectX)
|
||||
// require special support to enable the displaying of
|
||||
// an overlay window (particularly the IME window) over
|
||||
// the fullscreen graphics window. This is a hook for
|
||||
// the window to enable or disable that mode when
|
||||
// necessary.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void wdxGraphicsWindow7::
|
||||
support_overlay_window(bool flag) {
|
||||
if (_dxgsg != (DXGraphicsStateGuardian7 *)NULL) {
|
||||
_dxgsg->support_overlay_window(flag);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: wdxGraphicsWindow7::set_to_temp_rendertarget
|
||||
// Access: Private
|
||||
@@ -439,8 +391,9 @@ support_overlay_window(bool flag) {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool wdxGraphicsWindow7::
|
||||
set_to_temp_rendertarget() {
|
||||
return true;
|
||||
|
||||
LPDIRECTDRAWSURFACE7 pddsDummy = NULL, pddsDummyZ = NULL;
|
||||
ULONG refcnt;
|
||||
HRESULT hr;
|
||||
|
||||
DX_DECLARE_CLEAN(DDSURFACEDESC2, ddsd);
|
||||
@@ -453,8 +406,6 @@ set_to_temp_rendertarget() {
|
||||
ddsd.dwHeight = 1;
|
||||
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER);
|
||||
|
||||
PRINTVIDMEM(pDD, &ddsd.ddsCaps, "dummy backbuf");
|
||||
|
||||
hr = pDD->CreateSurface(&ddsd, &pddsDummy, NULL);
|
||||
if (FAILED(hr)) {
|
||||
wdxdisplay7_cat.error()
|
||||
@@ -470,8 +421,6 @@ set_to_temp_rendertarget() {
|
||||
ddsdZ.dwWidth = 1;
|
||||
ddsdZ.dwHeight = 1;
|
||||
|
||||
PRINTVIDMEM(pDD,&ddsdZ.ddsCaps,"dummy zbuf");
|
||||
|
||||
hr = pDD->CreateSurface(&ddsdZ, &pddsDummyZ, NULL);
|
||||
if (FAILED(hr)) {
|
||||
wdxdisplay7_cat.error()
|
||||
@@ -552,8 +501,6 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
ddsd.ddsCaps.dwCaps2 |= DDSCAPS2_HINTANTIALIASING;
|
||||
}
|
||||
|
||||
PRINTVIDMEM(pDD, &ddsd.ddsCaps, "initial primary & backbuf");
|
||||
|
||||
// Create the primary surface for the fullscreen window
|
||||
hr = pDD->CreateSurface(&ddsd, &pPrimaryDDSurf, NULL);
|
||||
if (FAILED(hr)) {
|
||||
@@ -673,8 +620,6 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
SurfaceDesc.dwFlags = DDSD_CAPS ;
|
||||
SurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||||
|
||||
PRINTVIDMEM(pDD, &SurfaceDesc.ddsCaps, "initial primary surface");
|
||||
|
||||
// Create the primary surface for windowed mode. This includes
|
||||
// all of the visible window, so no need to specify height/width.
|
||||
hr = pDD->CreateSurface(&SurfaceDesc, &pPrimaryDDSurf, NULL);
|
||||
@@ -725,8 +670,6 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
SurfaceDesc.ddsCaps.dwCaps2 |= DDSCAPS2_HINTANTIALIASING;
|
||||
}
|
||||
|
||||
PRINTVIDMEM(pDD, &SurfaceDesc.ddsCaps, "initial backbuf");
|
||||
|
||||
// Create the backbuffer. (might want to handle failure due to
|
||||
// running out of video memory)
|
||||
hr = pDD->CreateSurface(&SurfaceDesc, &pBackDDSurf, NULL);
|
||||
@@ -896,8 +839,6 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
}
|
||||
}
|
||||
|
||||
PRINTVIDMEM(pDD, &ddsd.ddsCaps, "initial zbuf");
|
||||
|
||||
#ifdef _DEBUG
|
||||
wdxdisplay7_cat.info()
|
||||
<< "Creating " << ddsd.ddpfPixelFormat.dwRGBBitCount << "bpp zbuffer\n";
|
||||
@@ -921,8 +862,6 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
<< "GetAvailVidMem lied, not enough VidMem for 32bpp, so trying 16bpp on device #"
|
||||
<< Display.CardIDNum << endl;
|
||||
|
||||
ULONG refcnt;
|
||||
|
||||
// free pri and back (maybe should just free pri since created
|
||||
// as complex chain?)
|
||||
RELEASE(pBackDDSurf, wdxdisplay7, "backbuffer", false);
|
||||
@@ -993,13 +932,13 @@ create_screen_buffers_and_device(DXScreenData &Display, bool force_16bpp_zbuffer
|
||||
|
||||
_dxgsg->set_context(&Display);
|
||||
//pDD, pPrimaryDDSurf, pBackDDSurf, pZDDSurf, pD3DI, pD3DDevice, view_rect);
|
||||
_dxgsg->dx_init();
|
||||
// _dxgsg->dx_init();
|
||||
|
||||
// do not SetDXReady() yet since caller may want to do more work
|
||||
// before letting rendering proceed
|
||||
|
||||
// Oh, go ahead and call it.
|
||||
_dxgsg->SetDXReady(true);
|
||||
// _dxgsg->SetDXReady(true);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
@@ -1389,33 +1328,3 @@ set_coop_levels_and_display_modes() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
// probably need this here similar to dx8
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: wdxGraphicsWindow8::begin_frame
|
||||
// Access: Public, Virtual
|
||||
// Description: This function will be called within the draw thread
|
||||
// before beginning rendering for a given frame. It
|
||||
// should do whatever setup is required, and return true
|
||||
// if the frame should be rendered, or false if it
|
||||
// should be skipped.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool wdxGraphicsWindow7::
|
||||
begin_frame() {
|
||||
if (_awaiting_restore) {
|
||||
// The fullscreen window was recently restored; we can't continue
|
||||
// until the GSG says we can.
|
||||
if (!_dxgsg->CheckCooperativeLevel()) {
|
||||
// Keep waiting.
|
||||
return false;
|
||||
}
|
||||
_awaiting_restore = false;
|
||||
|
||||
init_resized_window();
|
||||
}
|
||||
|
||||
return WinGraphicsWindow::begin_frame();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -46,7 +46,6 @@ public:
|
||||
const string &name);
|
||||
virtual ~wdxGraphicsWindow7();
|
||||
virtual void end_flip();
|
||||
//virtual bool begin_frame();
|
||||
virtual void make_current();
|
||||
virtual bool open_window();
|
||||
|
||||
@@ -54,7 +53,6 @@ protected:
|
||||
virtual void fullscreen_restored(WindowProperties &properties);
|
||||
virtual void handle_reshape();
|
||||
virtual bool do_fullscreen_resize(int x_size, int y_size);
|
||||
virtual void support_overlay_window(bool flag);
|
||||
|
||||
private:
|
||||
bool set_to_temp_rendertarget();
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
#include "geomLines.h"
|
||||
#include "geomLinestrips.h"
|
||||
#include "geomPoints.h"
|
||||
#include "GeomVertexReader.h"
|
||||
#include "geomVertexReader.h"
|
||||
#include "dxGeomMunger8.h"
|
||||
#include "config_gobj.h"
|
||||
#include "dxVertexBufferContext8.h"
|
||||
@@ -112,6 +112,7 @@ DXGraphicsStateGuardian8(const FrameBufferProperties &properties) :
|
||||
_supported_geom_rendering =
|
||||
Geom::GR_point | Geom::GR_point_uniform_size |
|
||||
Geom::GR_point_perspective | Geom::GR_point_sprite |
|
||||
Geom::GR_indexed_other |
|
||||
Geom::GR_triangle_strip | Geom::GR_triangle_fan |
|
||||
Geom::GR_flat_first_vertex;
|
||||
}
|
||||
@@ -176,27 +177,25 @@ apply_texture(int i, TextureContext *tc) {
|
||||
|
||||
int dirty = dtc->get_dirty_flags();
|
||||
|
||||
if (dirty) {
|
||||
// If the texture image has changed, or if its use of mipmaps has
|
||||
// changed, we need to re-create the image. Ignore other types of
|
||||
// changes, which aren't significant for DX.
|
||||
|
||||
if ((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
|
||||
// If this is *only* because of a mipmap change, issue a
|
||||
// warning--it is likely that this change is the result of an
|
||||
// error or oversight.
|
||||
if ((dirty & Texture::DF_image) == 0) {
|
||||
dxgsg8_cat.warning()
|
||||
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n";
|
||||
}
|
||||
|
||||
if (!dtc->create_texture(*_screen)) {
|
||||
// Oops, we can't re-create the texture for some reason.
|
||||
dxgsg8_cat.error()
|
||||
<< "Unable to re-create texture " << *dtc->_texture << endl;
|
||||
_d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
||||
return;
|
||||
}
|
||||
// If the texture image has changed, or if its use of mipmaps has
|
||||
// changed, we need to re-create the image. Ignore other types of
|
||||
// changes, which aren't significant for DX.
|
||||
|
||||
if ((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
|
||||
// If this is *only* because of a mipmap change, issue a
|
||||
// warning--it is likely that this change is the result of an
|
||||
// error or oversight.
|
||||
if ((dirty & Texture::DF_image) == 0) {
|
||||
dxgsg8_cat.warning()
|
||||
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n";
|
||||
}
|
||||
|
||||
if (!dtc->create_texture(*_screen)) {
|
||||
// Oops, we can't re-create the texture for some reason.
|
||||
dxgsg8_cat.error()
|
||||
<< "Unable to re-create texture " << *dtc->_texture << endl;
|
||||
_d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -928,6 +927,11 @@ draw_triangles(const GeomTriangles *primitive) {
|
||||
// Nonindexed, client arrays.
|
||||
int stride = _vertex_data->get_format()->get_array(0)->get_stride();
|
||||
unsigned int first_vertex = primitive->get_first_vertex();
|
||||
|
||||
// Interestingly, my ATI driver seems to fail to draw anything
|
||||
// in this call if the address range of the buffer supplied
|
||||
// crosses over a multiple of 0x10000. I refuse to hack around
|
||||
// this lame driver bug.
|
||||
_d3d_device->DrawPrimitiveUP
|
||||
(D3DPT_TRIANGLELIST,
|
||||
primitive->get_num_primitives(),
|
||||
|
||||
@@ -155,7 +155,7 @@ protected:
|
||||
|
||||
void dx_cleanup();
|
||||
HRESULT reset_d3d_device(D3DPRESENT_PARAMETERS *p_presentation_params,
|
||||
DXScreenData **pScrn = NULL);
|
||||
DXScreenData **screen = NULL);
|
||||
|
||||
bool check_cooperative_level();
|
||||
|
||||
@@ -174,7 +174,7 @@ protected:
|
||||
|
||||
protected:
|
||||
DXScreenData *_screen;
|
||||
LPDIRECT3DDEVICE8 _d3d_device; // same as pScrn->_d3d_device, cached for spd
|
||||
LPDIRECT3DDEVICE8 _d3d_device; // same as _screen->_d3d_device, cached for spd
|
||||
IDirect3DSwapChain8 *_swap_chain;
|
||||
D3DPRESENT_PARAMETERS _presentation_reset; // This is built during reset device
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef wdxGraphicsWindow8_H
|
||||
#define wdxGraphicsWindow8_H
|
||||
#ifndef WDXGRAPHICSWINDOW8_H
|
||||
#define WDXGRAPHICSWINDOW8_H
|
||||
|
||||
#include "pandabase.h"
|
||||
#include "winGraphicsWindow.h"
|
||||
|
||||
@@ -295,6 +295,7 @@ reset() {
|
||||
_supported_geom_rendering =
|
||||
Geom::GR_indexed_point |
|
||||
Geom::GR_point | Geom::GR_point_uniform_size |
|
||||
Geom::GR_indexed_other |
|
||||
Geom::GR_triangle_strip | Geom::GR_triangle_fan |
|
||||
Geom::GR_flat_last_vertex;
|
||||
|
||||
@@ -3397,16 +3398,6 @@ bind_light(Spotlight *light_obj, const NodePath &light, int light_id) {
|
||||
report_my_gl_errors();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GLGraphicsStateGuardian::wants_texcoords
|
||||
// Access: Public, Virtual
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool CLP(GraphicsStateGuardian)::
|
||||
wants_texcoords() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_IMMEDIATE_MODE
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GLGraphicsStateGuardian::draw_immediate_simple_primitives
|
||||
|
||||
@@ -133,8 +133,6 @@ public:
|
||||
virtual void bind_light(Spotlight *light_obj, const NodePath &light,
|
||||
int light_id);
|
||||
|
||||
virtual bool wants_texcoords() const;
|
||||
|
||||
void print_gfx_visual();
|
||||
|
||||
//For those interested in what the guardian thinks is the current
|
||||
|
||||
+23
-20
@@ -80,63 +80,66 @@ PUBLISHED:
|
||||
// two indicates whether the Geom needs to be munged for the GSG.
|
||||
enum GeomRendering {
|
||||
// If there are indexed points.
|
||||
GR_indexed_point = 0x0001,
|
||||
GR_indexed_point = 0x00001,
|
||||
|
||||
// If there is indexed geometry of any other type.
|
||||
GR_indexed_other = 0x10000,
|
||||
|
||||
// The union of all of the indexed attributes.
|
||||
GR_indexed_bits = 0x0001,
|
||||
GR_indexed_bits = 0x10001,
|
||||
|
||||
// If there are any points at all.
|
||||
GR_point = 0x0002,
|
||||
GR_point = 0x00002,
|
||||
|
||||
// If the points are all the same size, other than 1 pixel.
|
||||
GR_point_uniform_size = 0x0004,
|
||||
GR_point_uniform_size = 0x00004,
|
||||
|
||||
// If the points have a per-vertex size designation.
|
||||
GR_per_point_size = 0x0008,
|
||||
GR_per_point_size = 0x00008,
|
||||
|
||||
// If the points' size is specified in camera units rather than
|
||||
// screen pixels.
|
||||
GR_point_perspective = 0x0010,
|
||||
GR_point_perspective = 0x00010,
|
||||
|
||||
// If the points have a non-square aspect ratio.
|
||||
GR_point_aspect_ratio = 0x0020,
|
||||
GR_point_aspect_ratio = 0x00020,
|
||||
|
||||
// If the points are under a scale transform, uniform or non-uniform.
|
||||
GR_point_scale = 0x0040,
|
||||
GR_point_scale = 0x00040,
|
||||
|
||||
// If the points are rotated off the orthonormal axis.
|
||||
GR_point_rotate = 0x0080,
|
||||
GR_point_rotate = 0x00080,
|
||||
|
||||
// If the points require texture coordinates interpolated across
|
||||
// their face, to render textures as sprites.
|
||||
GR_point_sprite = 0x0100,
|
||||
GR_point_sprite = 0x00100,
|
||||
|
||||
// If there is a texture matrix applied to the sprite's generated
|
||||
// texture coordinates.
|
||||
GR_point_sprite_tex_matrix = 0x0200,
|
||||
GR_point_sprite_tex_matrix = 0x00200,
|
||||
|
||||
// The union of all the above point attributes, except GR_indexed_point.
|
||||
GR_point_bits = 0x03fe,
|
||||
GR_point_bits = 0x003fe,
|
||||
|
||||
// If there are any of these composite types.
|
||||
GR_triangle_strip = 0x0400,
|
||||
GR_triangle_fan = 0x0800,
|
||||
GR_line_strip = 0x1000,
|
||||
GR_triangle_strip = 0x00400,
|
||||
GR_triangle_fan = 0x00800,
|
||||
GR_line_strip = 0x01000,
|
||||
|
||||
// The union of all of the above composite types.
|
||||
GR_composite_bits = 0x1c00,
|
||||
GR_composite_bits = 0x01c00,
|
||||
|
||||
// If the shade model requires a particular vertex for flat shading.
|
||||
GR_flat_first_vertex = 0x2000,
|
||||
GR_flat_last_vertex = 0x4000,
|
||||
GR_flat_first_vertex = 0x02000,
|
||||
GR_flat_last_vertex = 0x04000,
|
||||
|
||||
// The union of the above shade model types.
|
||||
GR_shade_model_bits = 0x6000,
|
||||
GR_shade_model_bits = 0x06000,
|
||||
|
||||
// If there is a TexGenAttrib in effect with M_light_vector
|
||||
// enabled, meaning we need to generate the tangent space light
|
||||
// vector as the texture coordinates.
|
||||
GR_texcoord_light_vector = 0x8000,
|
||||
GR_texcoord_light_vector = 0x08000,
|
||||
};
|
||||
|
||||
// The shade model specifies whether the per-vertex colors and
|
||||
|
||||
@@ -91,7 +91,11 @@ get_primitive_type() const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int GeomLinestrips::
|
||||
get_geom_rendering() const {
|
||||
return GR_line_strip;
|
||||
if (is_indexed()) {
|
||||
return GR_line_strip | GR_indexed_other;
|
||||
} else {
|
||||
return GR_line_strip;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -88,8 +88,11 @@ GeomPrimitive::
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int GeomPrimitive::
|
||||
get_geom_rendering() const {
|
||||
// The default is nothing fancy.
|
||||
return 0;
|
||||
if (is_indexed()) {
|
||||
return GR_indexed_other;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -90,7 +90,11 @@ get_primitive_type() const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int GeomTrifans::
|
||||
get_geom_rendering() const {
|
||||
return GR_triangle_fan;
|
||||
if (is_indexed()) {
|
||||
return GR_triangle_fan | GR_indexed_other;
|
||||
} else {
|
||||
return GR_triangle_fan;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -91,7 +91,11 @@ get_primitive_type() const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int GeomTristrips::
|
||||
get_geom_rendering() const {
|
||||
return GR_triangle_strip;
|
||||
if (is_indexed()) {
|
||||
return GR_triangle_strip | GR_indexed_other;
|
||||
} else {
|
||||
return GR_triangle_strip;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -53,7 +53,7 @@ is_linear() const {
|
||||
void MatrixLens::
|
||||
write(ostream &out, int indent_level) const {
|
||||
indent(out, indent_level) << get_type() << ":\n";
|
||||
_projection_mat.write(out, indent_level + 2);
|
||||
get_projection_mat().write(out, indent_level + 2);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -115,17 +115,11 @@ class Lens;
|
||||
// TypedReferenceCount for that convenience.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDA GraphicsStateGuardianBase : public TypedWritableReferenceCount {
|
||||
public:
|
||||
PUBLISHED:
|
||||
virtual bool get_supports_multisample() const=0;
|
||||
virtual int get_supported_geom_rendering() const=0;
|
||||
|
||||
// These functions will be queried by the GeomIssuer to determine if
|
||||
// it should issue normals, texcoords, and/or colors, based on the
|
||||
// GSG's current state.
|
||||
virtual bool wants_normals() const=0;
|
||||
virtual bool wants_texcoords() const=0;
|
||||
virtual bool wants_colors() const=0;
|
||||
|
||||
public:
|
||||
// These are some general interface functions; they're defined here
|
||||
// mainly to make it easy to call these from code in some directory
|
||||
// that display depends on.
|
||||
|
||||
@@ -131,7 +131,7 @@ operator *= (const FLOATNAME(LMatrix4) &mat) {
|
||||
// Access: Published
|
||||
// Description: Transforms the plane by the indicated matrix.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void FLOATNAME(Plane)::
|
||||
INLINE_MATHUTIL void FLOATNAME(Plane)::
|
||||
xform(const FLOATNAME(LMatrix4) &mat) {
|
||||
(*this) = (*this) * mat;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user