From 0fcd46e5bb93182047370bf188cba3ed842e85ac Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 11 Oct 2011 18:19:09 +0000 Subject: [PATCH] run on stdfloat_double --- panda/src/dxgsg8/dxGraphicsStateGuardian8.I | 2 +- panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx | 81 +++++++++++-------- panda/src/dxgsg9/dxGraphicsStateGuardian9.I | 2 +- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 80 ++++++++++-------- panda/src/dxgsg9/dxShaderContext9.cxx | 9 +-- 5 files changed, 101 insertions(+), 73 deletions(-) diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.I b/panda/src/dxgsg8/dxGraphicsStateGuardian8.I index c0c8401076..aad030845a 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.I +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.I @@ -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 diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index 535191df7c..2a327d8a50 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -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(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.I b/panda/src/dxgsg9/dxGraphicsStateGuardian9.I index 9edbc0104c..35b3b7ea4c 100755 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.I +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.I @@ -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 diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 7fdb716742..0851573d34 100755 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -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(); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/dxgsg9/dxShaderContext9.cxx b/panda/src/dxgsg9/dxShaderContext9.cxx index 14f7cacd61..0b75bc76d6 100644 --- a/panda/src/dxgsg9/dxShaderContext9.cxx +++ b/panda/src/dxgsg9/dxShaderContext9.cxx @@ -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);