run on stdfloat_double

This commit is contained in:
David Rose 2011-10-11 18:19:09 +00:00
parent 05c6cc00a4
commit 0fcd46e5bb
5 changed files with 101 additions and 73 deletions

View File

@ -22,7 +22,7 @@
INLINE DWORD DXGraphicsStateGuardian8::
LColor_to_D3DCOLOR(const LColor &cLColor) {
// MS VC defines _M_IX86 for x86. gcc should define _X86_
#if defined(_M_IX86) || defined(_X86_)
#if (defined(_M_IX86) || defined(_X86_)) && !defined(STDFLOAT_DOUBLE)
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

View File

@ -724,9 +724,10 @@ calc_projection_mat(const Lens *lens) {
bool DXGraphicsStateGuardian8::
prepare_lens() {
CPT(TransformState) scissor_proj_mat = _scissor_mat->compose(_projection_mat);
LMatrix4f mat = LCAST(float, scissor_proj_mat->get_mat());
HRESULT hr =
_d3d_device->SetTransform(D3DTS_PROJECTION,
(D3DMATRIX*)scissor_proj_mat->get_mat().get_data());
(D3DMATRIX*)mat.get_data());
return SUCCEEDED(hr);
}
@ -931,7 +932,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
for (int i = 0; i < table->get_num_transforms(); i++) {
LMatrix4 mat;
table->get_transform(i)->mult_matrix(mat, _internal_transform->get_mat());
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data();
LMatrix4f matf = LCAST(float, mat);
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)matf.get_data();
_d3d_device->SetTransform(D3DTS_WORLDMATRIX(i), d3d_mat);
}
@ -950,7 +952,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
}
if (_transform_stale && !_data_reader->is_vertex_transformed()) {
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)_internal_transform->get_mat().get_data();
LMatrix4f mat = LCAST(float, _internal_transform->get_mat());
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data();
_d3d_device->SetTransform(D3DTS_WORLD, d3d_mat);
_transform_stale = false;
}
@ -966,7 +969,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
// we want: that also prevents lighting calculations and user clip
// planes.
_d3d_device->SetTransform(D3DTS_WORLD, &_d3d_ident_mat);
static const LMatrix4 rescale_mat
static const LMatrix4f rescale_mat
(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0.5, 0,
@ -1471,8 +1474,9 @@ end_draw_primitives() {
if (_data_reader->is_vertex_transformed()) {
// Restore the projection matrix that we wiped out above.
LMatrix4f mat = LCAST(float, _projection_mat->get_mat());
_d3d_device->SetTransform(D3DTS_PROJECTION,
(D3DMATRIX*)_projection_mat->get_mat().get_data());
(D3DMATRIX*)mat.get_data());
}
GraphicsStateGuardian::end_draw_primitives();
@ -2135,7 +2139,8 @@ do_issue_transform() {
const TransformState *transform = _internal_transform;
DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1));
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)transform->get_mat().get_data();
LMatrix4f mat = LCAST(float, transform->get_mat());
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data();
_d3d_device->SetTransform(D3DTS_WORLD, d3d_mat);
_transform_stale = false;
@ -2588,7 +2593,7 @@ bind_light(PointLight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LPoint3 pos = light_obj->get_point() * rel_mat;
LPoint3f pos = LCAST(float, light_obj->get_point() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -2596,7 +2601,8 @@ bind_light(PointLight *light_obj, const NodePath &light, int light_id) {
alight.Type = D3DLIGHT_POINT;
alight.Diffuse = get_light_color(light_obj);
alight.Ambient = black ;
alight.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
alight.Specular = *(D3DCOLORVALUE *)(color.get_data());
// Position needs to specify x, y, z, and w
// w == 1 implies non-infinite position
@ -2640,7 +2646,7 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LVector3 dir = light_obj->get_direction() * rel_mat;
LVector3f dir = LCAST(float, light_obj->get_direction() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -2649,7 +2655,8 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
fdata.Type = D3DLIGHT_DIRECTIONAL;
fdata.Ambient = black ;
fdata.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
fdata.Specular = *(D3DCOLORVALUE *)(color.get_data());
fdata.Direction = *(D3DVECTOR *)dir.get_data();
@ -2693,8 +2700,8 @@ bind_light(Spotlight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LPoint3 pos = lens->get_nodal_point() * rel_mat;
LVector3 dir = lens->get_view_vector() * rel_mat;
LPoint3f pos = LCAST(float, lens->get_nodal_point() * rel_mat);
LVector3f dir = LCAST(float, lens->get_view_vector() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -2705,7 +2712,8 @@ bind_light(Spotlight *light_obj, const NodePath &light, int light_id) {
alight.Type = D3DLIGHT_SPOT;
alight.Ambient = black ;
alight.Diffuse = get_light_color(light_obj);
alight.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
alight.Specular = *(D3DCOLORVALUE *)(color.get_data());
alight.Position = *(D3DVECTOR *)pos.get_data();
@ -2773,10 +2781,14 @@ do_issue_material() {
}
D3DMATERIAL8 cur_material;
cur_material.Diffuse = *(D3DCOLORVALUE *)(material->get_diffuse().get_data());
cur_material.Ambient = *(D3DCOLORVALUE *)(material->get_ambient().get_data());
cur_material.Specular = *(D3DCOLORVALUE *)(material->get_specular().get_data());
cur_material.Emissive = *(D3DCOLORVALUE *)(material->get_emission().get_data());
LColorf color = LCAST(float, material->get_diffuse());
cur_material.Diffuse = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_ambient());
cur_material.Ambient = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_specular());
cur_material.Specular = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_emission());
cur_material.Emissive = *(D3DCOLORVALUE *)(color.get_data());
cur_material.Power = material->get_shininess();
if (material->has_diffuse()) {
@ -2785,7 +2797,8 @@ do_issue_material() {
} else {
// Otherwise, the diffuse color comes from the object color.
if (_has_material_force_color) {
cur_material.Diffuse = *(D3DCOLORVALUE *)_material_force_color.get_data();
color = LCAST(float, _material_force_color);
cur_material.Diffuse = *(D3DCOLORVALUE *)color.get_data();
_d3d_device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
} else {
_d3d_device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
@ -2797,7 +2810,8 @@ do_issue_material() {
} else {
// Otherwise, the ambient color comes from the object color.
if (_has_material_force_color) {
cur_material.Ambient = *(D3DCOLORVALUE *)_material_force_color.get_data();
color = LCAST(float, _material_force_color);
cur_material.Ambient = *(D3DCOLORVALUE *)color.get_data();
_d3d_device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
} else {
_d3d_device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1);
@ -2985,16 +2999,17 @@ do_issue_texture() {
if (/*tex_mat->is_2d() &&*/ texcoord_dimensions <= 2) {
// For 2-d texture coordinates, we have to reorder the matrix.
LMatrix4 m = tex_mat->get_mat();
m.set(m(0, 0), m(0, 1), m(0, 3), 0.0f,
m(1, 0), m(1, 1), m(1, 3), 0.0f,
m(3, 0), m(3, 1), m(3, 3), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)m.get_data());
LMatrix4f mf;
mf.set(m(0, 0), m(0, 1), m(0, 3), 0.0f,
m(1, 0), m(1, 1), m(1, 3), 0.0f,
m(3, 0), m(3, 1), m(3, 3), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)mf.get_data());
_d3d_device->SetTextureStageState(si, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2);
} else {
LMatrix4 m = tex_mat->get_mat();
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)m.get_data());
LMatrix4f m = LCAST(float, tex_mat->get_mat());
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)mf.get_data());
DWORD transform_flags = texcoord_dimensions;
if (m.get_col(3) != LVecBase4(0.0f, 0.0f, 0.0f, 1.0f)) {
// If we have a projected texture matrix, we also need to
@ -3358,13 +3373,13 @@ do_auto_rescale_normal() {
////////////////////////////////////////////////////////////////////
const D3DCOLORVALUE &DXGraphicsStateGuardian8::
get_light_color(Light *light) const {
static LColor c;
c = light->get_color();
c.set(c[0] * _light_color_scale[0],
c[1] * _light_color_scale[1],
c[2] * _light_color_scale[2],
c[3] * _light_color_scale[3]);
return *(D3DCOLORVALUE *)c.get_data();
LColor c = light->get_color();
static LColorf cf;
cf.set(c[0] * _light_color_scale[0],
c[1] * _light_color_scale[1],
c[2] * _light_color_scale[2],
c[3] * _light_color_scale[3]);
return *(D3DCOLORVALUE *)cf.get_data();
}
////////////////////////////////////////////////////////////////////

View File

@ -22,7 +22,7 @@
INLINE DWORD DXGraphicsStateGuardian9::
LColor_to_D3DCOLOR(const LColor &cLColor) {
// MS VC defines _M_IX86 for x86. gcc should define _X86_
#if defined(_M_IX86) || defined(_X86_)
#if (defined(_M_IX86) || defined(_X86_)) && !defined(STDFLOAT_DOUBLE)
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

View File

@ -988,9 +988,10 @@ calc_projection_mat(const Lens *lens) {
////////////////////////////////////////////////////////////////////
bool DXGraphicsStateGuardian9::
prepare_lens() {
LMatrix4f mat = LCAST(float, _projection_mat->get_mat());
HRESULT hr =
_d3d_device->SetTransform(D3DTS_PROJECTION,
(D3DMATRIX*)_projection_mat->get_mat().get_data());
(D3DMATRIX*)mat.get_data());
return SUCCEEDED(hr);
}
@ -1280,7 +1281,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
// we want: that also prevents lighting calculations and user clip
// planes.
_d3d_device->SetTransform(D3DTS_WORLD, &_d3d_ident_mat);
static const LMatrix4 rescale_mat
static const LMatrix4f rescale_mat
(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0.5, 0,
@ -1867,8 +1868,9 @@ end_draw_primitives() {
if (_data_reader->is_vertex_transformed()) {
// Restore the projection matrix that we wiped out above.
LMatrix4f mat = LCAST(float, _projection_mat->get_mat());
_d3d_device->SetTransform(D3DTS_PROJECTION,
(D3DMATRIX*)_projection_mat->get_mat().get_data());
(D3DMATRIX*)mat.get_data());
}
GraphicsStateGuardian::end_draw_primitives();
@ -2816,12 +2818,14 @@ do_issue_transform() {
_current_shader_context->issue_parameters(this, Shader::SSD_transform);
// ??? NO NEED TO SET THE D3D TRANSFORM VIA SetTransform SINCE THE TRANSFORM IS ONLY USED IN THE SHADER
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)transform->get_mat().get_data();
LMatrix4f mat = LCAST(float, transform->get_mat());
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data();
_d3d_device->SetTransform(D3DTS_WORLD, d3d_mat);
}
else {
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)transform->get_mat().get_data();
LMatrix4f mat = LCAST(float, transform->get_mat());
const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data();
_d3d_device->SetTransform(D3DTS_WORLD, d3d_mat);
// DEBUG PRINT
@ -3384,7 +3388,7 @@ bind_light(PointLight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LPoint3 pos = light_obj->get_point() * rel_mat;
LPoint3f pos = LCAST(float, light_obj->get_point() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -3392,7 +3396,8 @@ bind_light(PointLight *light_obj, const NodePath &light, int light_id) {
alight.Type = D3DLIGHT_POINT;
alight.Diffuse = get_light_color(light_obj);
alight.Ambient = black ;
alight.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
alight.Specular = *(D3DCOLORVALUE *)(color.get_data());
// Position needs to specify x, y, z, and w
// w == 1 implies non-infinite position
@ -3436,7 +3441,7 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LVector3 dir = light_obj->get_direction() * rel_mat;
LVector3f dir = LCAST(float, light_obj->get_direction() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -3445,7 +3450,8 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
fdata.Type = D3DLIGHT_DIRECTIONAL;
fdata.Ambient = black ;
fdata.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
fdata.Specular = *(D3DCOLORVALUE *)(color.get_data());
fdata.Direction = *(D3DVECTOR *)dir.get_data();
@ -3489,8 +3495,8 @@ bind_light(Spotlight *light_obj, const NodePath &light, int light_id) {
CPT(TransformState) transform = light.get_transform(_scene_setup->get_camera_path());
const LMatrix4 &light_mat = transform->get_mat();
LMatrix4 rel_mat = light_mat * LMatrix4::convert_mat(CS_yup_left, CS_default);
LPoint3 pos = lens->get_nodal_point() * rel_mat;
LVector3 dir = lens->get_view_vector() * rel_mat;
LPoint3f pos = LCAST(float, lens->get_nodal_point() * rel_mat);
LVector3f dir = LCAST(float, lens->get_view_vector() * rel_mat);
D3DCOLORVALUE black;
black.r = black.g = black.b = black.a = 0.0f;
@ -3501,7 +3507,8 @@ bind_light(Spotlight *light_obj, const NodePath &light, int light_id) {
alight.Type = D3DLIGHT_SPOT;
alight.Ambient = black ;
alight.Diffuse = get_light_color(light_obj);
alight.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
LColorf color = LCAST(float, light_obj->get_specular_color());
alight.Specular = *(D3DCOLORVALUE *)(color.get_data());
alight.Position = *(D3DVECTOR *)pos.get_data();
@ -3569,10 +3576,14 @@ do_issue_material() {
}
D3DMATERIAL9 cur_material;
cur_material.Diffuse = *(D3DCOLORVALUE *)(material->get_diffuse().get_data());
cur_material.Ambient = *(D3DCOLORVALUE *)(material->get_ambient().get_data());
cur_material.Specular = *(D3DCOLORVALUE *)(material->get_specular().get_data());
cur_material.Emissive = *(D3DCOLORVALUE *)(material->get_emission().get_data());
LColorf color = LCAST(float, material->get_diffuse());
cur_material.Diffuse = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_ambient());
cur_material.Ambient = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_specular());
cur_material.Specular = *(D3DCOLORVALUE *)(color.get_data());
color = LCAST(float, material->get_emission());
cur_material.Emissive = *(D3DCOLORVALUE *)(color.get_data());
cur_material.Power = material->get_shininess();
if (material->has_diffuse()) {
@ -3581,7 +3592,8 @@ do_issue_material() {
} else {
// Otherwise, the diffuse color comes from the object color.
if (_has_material_force_color) {
cur_material.Diffuse = *(D3DCOLORVALUE *)_material_force_color.get_data();
color = LCAST(float, _material_force_color);
cur_material.Diffuse = *(D3DCOLORVALUE *)color.get_data();
set_render_state(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
} else {
set_render_state(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
@ -3593,7 +3605,8 @@ do_issue_material() {
} else {
// Otherwise, the ambient color comes from the object color.
if (_has_material_force_color) {
cur_material.Ambient = *(D3DCOLORVALUE *)_material_force_color.get_data();
color = LCAST(float, _material_force_color);
cur_material.Ambient = *(D3DCOLORVALUE *)color.get_data();
set_render_state(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
} else {
set_render_state(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1);
@ -3841,18 +3854,19 @@ update_standard_texture_bindings() {
if (/*tex_mat->is_2d() &&*/ texcoord_dimensions <= 2) {
// For 2-d texture coordinates, we have to reorder the matrix.
LMatrix4 m = tex_mat->get_mat();
m.set(m(0, 0), m(0, 1), m(0, 3), 0.0f,
m(1, 0), m(1, 1), m(1, 3), 0.0f,
m(3, 0), m(3, 1), m(3, 3), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)m.get_data());
LMatrix4f mf;
mf.set(m(0, 0), m(0, 1), m(0, 3), 0.0f,
m(1, 0), m(1, 1), m(1, 3), 0.0f,
m(3, 0), m(3, 1), m(3, 3), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)mf.get_data());
set_texture_stage_state(si, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2);
} else {
LMatrix4 m = tex_mat->get_mat();
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)m.get_data());
LMatrix4f mf = LCAST(float, tex_mat->get_mat());
_d3d_device->SetTransform(get_tex_mat_sym(si), (D3DMATRIX *)mf.get_data());
DWORD transform_flags = texcoord_dimensions;
if (m.get_col(3) != LVecBase4(0.0f, 0.0f, 0.0f, 1.0f)) {
if (mf.get_col(3) != LVecBase4f(0.0f, 0.0f, 0.0f, 1.0f)) {
// If we have a projected texture matrix, we also need to
// set D3DTTFF_COUNT4.
transform_flags = D3DTTFF_COUNT4 | D3DTTFF_PROJECTED;
@ -4229,13 +4243,13 @@ do_auto_rescale_normal() {
////////////////////////////////////////////////////////////////////
const D3DCOLORVALUE &DXGraphicsStateGuardian9::
get_light_color(Light *light) const {
static LColor c;
c = light->get_color();
c.set(c[0] * _light_color_scale[0],
c[1] * _light_color_scale[1],
c[2] * _light_color_scale[2],
c[3] * _light_color_scale[3]);
return *(D3DCOLORVALUE *)c.get_data();
LColor c = light->get_color();
static LColorf cf;
cf.set(c[0] * _light_color_scale[0],
c[1] * _light_color_scale[1],
c[2] * _light_color_scale[2],
c[3] * _light_color_scale[3]);
return *(D3DCOLORVALUE *)cf.get_data();
}
////////////////////////////////////////////////////////////////////

View File

@ -384,13 +384,12 @@ issue_parameters(GSG *gsg, int altered)
if (val) {
HRESULT hr;
PN_stdfloat v [4];
LMatrix4 temp_matrix;
LMatrix4f temp_matrix = LCAST(float, *val);
hr = D3D_OK;
const PN_stdfloat *data;
data = val -> get_data ( );
const float *data;
data = temp_matrix.get_data();
#if DEBUG_SHADER
// DEBUG
@ -403,7 +402,7 @@ issue_parameters(GSG *gsg, int altered)
switch (_shader->_mat_spec[i]._piece) {
case Shader::SMP_whole:
// TRANSPOSE REQUIRED
temp_matrix.transpose_from (*val);
temp_matrix.transpose_in_place();
data = temp_matrix.get_data();
hr = cgD3D9SetUniform (p, data);