From 942e64ae6013a748bb7b99439088fd9d5dc96645 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 3 Oct 2005 14:33:39 +0000 Subject: [PATCH] fix cubemap-to-ram --- panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx | 43 ++++++++++++++++--- panda/src/dxgsg8/dxTextureContext8.cxx | 9 ++-- panda/src/dxgsg8/dxTextureContext8.h | 3 +- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index c48533b0fd..8d732927a2 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -1386,7 +1386,35 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend int xo, yo, w, h; dr->get_region_pixels_i(xo, yo, w, h); - tex->setup_2d_texture(w, h, Texture::T_unsigned_byte, Texture::F_rgb); + Texture::Format format = tex->get_format(); + Texture::ComponentType component_type = tex->get_component_type(); + + switch (format) { + case Texture::F_depth_component: + case Texture::F_stencil_index: + // Sorry, not (yet?) supported in pandadx. + return false; + + default: + format = Texture::F_rgb; + component_type = Texture::T_unsigned_byte; + } + + Texture::TextureType texture_type; + if (z >= 0) { + texture_type = Texture::TT_cube_map; + } else { + texture_type = Texture::TT_2d_texture; + } + + if (tex->get_x_size() != w || tex->get_y_size() != h || + tex->get_component_type() != component_type || + tex->get_format() != format || + tex->get_texture_type() != texture_type) { + // Re-setup the texture; its properties have changed. + tex->setup_texture(texture_type, w, h, tex->get_z_size(), + component_type, format); + } rect.top = yo; rect.left = xo; @@ -1488,7 +1516,7 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend } DXTextureContext8::d3d_surface_to_texture(rect, temp_surface, - copy_inverted, tex); + copy_inverted, tex, z); RELEASE(temp_surface, dxgsg8, "temp_surface", RELEASE_ONCE); @@ -2500,7 +2528,7 @@ do_issue_texture() { { _d3d_device->SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, texcoord_index | D3DTSS_TCI_CAMERASPACEPOSITION); - texcoord_dimensions = 4; + texcoord_dimensions = 3; CPT(TransformState) camera_transform = _scene_setup->get_camera_transform()->compose(_inv_cs_transform); tex_mat = tex_mat->compose(camera_transform); } @@ -2509,7 +2537,7 @@ do_issue_texture() { case TexGenAttrib::M_eye_position: _d3d_device->SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, texcoord_index | D3DTSS_TCI_CAMERASPACEPOSITION); - texcoord_dimensions = 4; + texcoord_dimensions = 3; tex_mat = tex_mat->compose(_inv_cs_transform); break; @@ -2536,9 +2564,10 @@ do_issue_texture() { LMatrix4f m = tex_mat->get_mat(); _d3d_device->SetTransform(get_tex_mat_sym(i), (D3DMATRIX *)m.get_data()); DWORD transform_flags = texcoord_dimensions; - //if (m.get_col3(3) != LVecBase3f::zero()) - { - transform_flags |= D3DTTFF_PROJECTED; + if (m.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; } _d3d_device->SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, transform_flags); diff --git a/panda/src/dxgsg8/dxTextureContext8.cxx b/panda/src/dxgsg8/dxTextureContext8.cxx index 1236aa4892..20008e41a7 100644 --- a/panda/src/dxgsg8/dxTextureContext8.cxx +++ b/panda/src/dxgsg8/dxTextureContext8.cxx @@ -711,7 +711,7 @@ delete_texture() { //////////////////////////////////////////////////////////////////// HRESULT DXTextureContext8:: d3d_surface_to_texture(RECT &source_rect, IDirect3DSurface8 *d3d_surface, - bool inverted, Texture *result) { + bool inverted, Texture *result, int z) { // still need custom conversion since d3d/d3dx has no way to convert // arbitrary fmt to ARGB in-memory user buffer @@ -723,8 +723,11 @@ d3d_surface_to_texture(RECT &source_rect, IDirect3DSurface8 *d3d_surface, nassertr((num_components == 3) || (num_components == 4), E_FAIL); // cant handle anything else now nassertr(IS_VALID_PTR(d3d_surface), E_FAIL); - PTA_uchar ram_image = result->modify_ram_image(); - BYTE *buf = ram_image.p(); + BYTE *buf = result->modify_ram_image(); + if (z >= 0) { + nassertr(z < result->get_z_size(), E_FAIL); + buf += z * result->get_expected_ram_page_size(); + } if (IsBadWritePtr(d3d_surface, sizeof(DWORD))) { dxgsg8_cat.error() diff --git a/panda/src/dxgsg8/dxTextureContext8.h b/panda/src/dxgsg8/dxTextureContext8.h index f546bffb52..c8a6f7c267 100644 --- a/panda/src/dxgsg8/dxTextureContext8.h +++ b/panda/src/dxgsg8/dxTextureContext8.h @@ -43,7 +43,8 @@ public: static HRESULT d3d_surface_to_texture(RECT &source_rect, IDirect3DSurface8 *d3d_surface, - bool inverted, Texture *result); + bool inverted, Texture *result, + int z); private: HRESULT fill_d3d_texture_pixels();