mirror of https://github.com/AxioDL/metaforce.git
Add a raw verts version for queue_textured_quad
This commit is contained in:
parent
4c705683bc
commit
b8e60eac1b
|
@ -14,7 +14,7 @@ use fog_volume_filter::queue_fog_volume_filter;
|
|||
use fog_volume_plane::queue_fog_volume_plane;
|
||||
use model::{add_material_set, add_model};
|
||||
use texture::{create_render_texture, create_static_texture_2d, drop_texture};
|
||||
use textured_quad::queue_textured_quad;
|
||||
use textured_quad::{queue_textured_quad_verts, queue_textured_quad};
|
||||
use twox_hash::Xxh3Hash64;
|
||||
use wgpu::RenderPipeline;
|
||||
|
||||
|
@ -185,6 +185,15 @@ mod ffi {
|
|||
fn queue_aabb(aabb: CAABox, color: CColor, z_only: bool);
|
||||
fn queue_fog_volume_plane(verts: &CxxVector<CVector4f>, pass: u8);
|
||||
fn queue_fog_volume_filter(color: CColor, two_way: bool);
|
||||
fn queue_textured_quad_verts(
|
||||
filter_type: CameraFilterType,
|
||||
texture: TextureRef,
|
||||
z_test: ZTest,
|
||||
color: CColor,
|
||||
pos: &[CVector3f],
|
||||
uvs: &[CVector2f],
|
||||
lod: f32,
|
||||
);
|
||||
fn queue_textured_quad(
|
||||
filter_type: CameraFilterType,
|
||||
texture: TextureRef,
|
||||
|
|
|
@ -7,6 +7,7 @@ use crate::{
|
|||
get_app,
|
||||
gpu::GraphicsConfig,
|
||||
shaders::{
|
||||
get_combined_matrix,
|
||||
bind_pipeline,
|
||||
BuiltBuffers,
|
||||
ffi::{CameraFilterType, TextureRef, ZTest}, pipeline_ref, PipelineCreateCommand, PipelineHolder, PipelineRef,
|
||||
|
@ -267,6 +268,15 @@ pub(crate) fn queue_textured_quad(
|
|||
lod: 0.0,
|
||||
});
|
||||
|
||||
push_textured_quad(texture, pipeline, vert_range, uniform_range);
|
||||
}
|
||||
|
||||
fn push_textured_quad(
|
||||
texture: TextureRef,
|
||||
pipeline: PipelineRef,
|
||||
vert_range: Range<u64>,
|
||||
uniform_range: Range<u64>
|
||||
){
|
||||
// TODO defer bind group creation to draw time or another thread?
|
||||
let state = unsafe { STATE.as_mut().unwrap_unchecked() };
|
||||
let groups = &mut state.textured_quad.texture_bind_groups;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use bytemuck_derive::{Pod, Zeroable};
|
||||
use cxx::{type_id, ExternType};
|
||||
use crate::util::{Vec2, Vec3};
|
||||
|
||||
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
||||
#[repr(C)]
|
||||
|
@ -169,3 +170,42 @@ impl From<CMatrix4f> for cgmath::Matrix4<f32> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Vec2<f32>> for CVector2f {
|
||||
fn from(v: Vec2<f32>) -> Self {
|
||||
Self {
|
||||
x: v.x,
|
||||
y: v.y,
|
||||
_p1: 0.0,
|
||||
_p2: 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<CVector2f> for Vec2<f32> {
|
||||
fn from(v: CVector2f) -> Self {
|
||||
Self {
|
||||
x: v.x,
|
||||
y: v.y,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Vec3<f32>> for CVector3f {
|
||||
fn from(v: Vec3<f32>) -> Self {
|
||||
Self {
|
||||
x: v.x,
|
||||
y: v.y,
|
||||
z: v.z,
|
||||
_p: 0.0,
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<CVector3f> for Vec3<f32> {
|
||||
fn from(v: CVector3f) -> Self {
|
||||
Self {
|
||||
x: v.x,
|
||||
y: v.y,
|
||||
z: v.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ CAuiImagePane::Filters::Filters(TLockedToken<CTexture>& tex)
|
|||
, m_addQuad{{CTexturedQuadFilterAlpha{EFilterType::Add, tex}, CTexturedQuadFilterAlpha{EFilterType::Add, tex}}} {}
|
||||
|
||||
void CAuiImagePane::DoDrawImagePane(const zeus::CColor& color, const CTexture& tex, int frame, float alpha, bool noBlur,
|
||||
CTexturedQuadFilterAlpha& quad) const {
|
||||
EFilterType filter) const {
|
||||
zeus::CColor useColor = color;
|
||||
useColor.a() *= alpha;
|
||||
|
||||
|
@ -82,6 +82,12 @@ void CAuiImagePane::DoDrawImagePane(const zeus::CColor& color, const CTexture& t
|
|||
useUVs = &x114_uvs;
|
||||
}
|
||||
|
||||
std::vector<zeus::CVector2f> realUseUvs;
|
||||
realUseUvs.reserve(4);
|
||||
for (auto v : *useUVs) {
|
||||
realUseUvs.push_back(v + xd0_uvBias0);
|
||||
}
|
||||
|
||||
const std::array<CTexturedQuadFilter::Vert, 4> verts{{
|
||||
{xe0_coords[0], (*useUVs)[0] + xd0_uvBias0},
|
||||
{xe0_coords[1], (*useUVs)[1] + xd0_uvBias0},
|
||||
|
@ -90,14 +96,21 @@ void CAuiImagePane::DoDrawImagePane(const zeus::CColor& color, const CTexture& t
|
|||
}};
|
||||
|
||||
if (noBlur) {
|
||||
quad.drawVerts(useColor, verts);
|
||||
aurora::shaders::queue_textured_quad_verts(
|
||||
aurora::shaders::CameraFilterType(filter), tex.GetTexture()->ref, aurora::shaders::ZTest::None, useColor,
|
||||
{xe0_coords.data(), xe0_coords.size()}, {realUseUvs.data(), xe0_coords.size()}, 0);
|
||||
// quad.drawVerts(useColor, verts);
|
||||
} else if ((x14c_deResFactor == 0.f && alpha == 1.f) || tex.GetNumMips() == 1) {
|
||||
quad.drawVerts(useColor, verts, 0.f);
|
||||
aurora::shaders::queue_textured_quad_verts(
|
||||
aurora::shaders::CameraFilterType(filter), tex.GetTexture()->ref, aurora::shaders::ZTest::None, useColor,
|
||||
{xe0_coords.data(), xe0_coords.size()}, {realUseUvs.data(), xe0_coords.size()}, 0);
|
||||
} else {
|
||||
const float tmp = (1.f - x14c_deResFactor) * alpha;
|
||||
const float tmp3 = 1.f - tmp * tmp * tmp;
|
||||
const float mip = tmp3 * static_cast<float>(tex.GetNumMips() - 1);
|
||||
quad.drawVerts(useColor, verts, mip);
|
||||
aurora::shaders::queue_textured_quad_verts(
|
||||
aurora::shaders::CameraFilterType(filter), tex.GetTexture()->ref, aurora::shaders::ZTest::None, useColor,
|
||||
{xe0_coords.data(), xe0_coords.size()}, {realUseUvs.data(), xe0_coords.size()}, mip);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,46 +143,46 @@ void CAuiImagePane::Draw(const CGuiWidgetDrawParms& params) {
|
|||
}
|
||||
|
||||
// Alpha blend
|
||||
DoDrawImagePane(color * zeus::CColor(0.f, 0.5f), *xb8_tex0Tok, frame0, 1.f, true, filters.m_darkenerQuad);
|
||||
DoDrawImagePane(color * zeus::CColor(0.f, 0.5f), *xb8_tex0Tok, frame0, 1.f, true, EFilterType::Blend);
|
||||
|
||||
if (x150_flashFactor > 0.f) {
|
||||
// Additive blend
|
||||
zeus::CColor color2 = xa8_color2;
|
||||
color2.a() = x150_flashFactor;
|
||||
DoDrawImagePane(color2, *xb8_tex0Tok, frame0, blur0, false, filters.m_flashQuad[0]);
|
||||
DoDrawImagePane(color2, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Blend);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color2, *xb8_tex0Tok, frame1, blur1, false, filters.m_flashQuad[1]);
|
||||
DoDrawImagePane(color2, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Blend);
|
||||
}
|
||||
|
||||
switch (xac_drawFlags) {
|
||||
case EGuiModelDrawFlags::Shadeless:
|
||||
case EGuiModelDrawFlags::Opaque:
|
||||
// Opaque blend
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, filters.m_alphaQuad[0]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Blend);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, filters.m_alphaQuad[1]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Blend);
|
||||
break;
|
||||
case EGuiModelDrawFlags::Alpha:
|
||||
// Alpha blend
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, filters.m_alphaQuad[0]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Blend);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, filters.m_alphaQuad[1]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Blend);
|
||||
break;
|
||||
case EGuiModelDrawFlags::Additive:
|
||||
// Additive blend
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, filters.m_addQuad[0]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Add);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, filters.m_addQuad[1]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Add);
|
||||
break;
|
||||
case EGuiModelDrawFlags::AlphaAdditiveOverdraw:
|
||||
// Alpha blend
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, filters.m_alphaQuad[0]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Blend);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, filters.m_alphaQuad[1]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Blend);
|
||||
// Full additive blend
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, filters.m_addQuad[0]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame0, blur0, false, EFilterType::Add);
|
||||
if (blur1 > 0.f)
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, filters.m_addQuad[1]);
|
||||
DoDrawImagePane(color, *xb8_tex0Tok, frame1, blur1, false, EFilterType::Add);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -42,7 +42,7 @@ class CAuiImagePane : public CGuiWidget {
|
|||
};
|
||||
std::optional<Filters> m_filters;
|
||||
void DoDrawImagePane(const zeus::CColor& color, const CTexture& tex, int frame, float blurAmt, bool noBlur,
|
||||
CTexturedQuadFilterAlpha& quad) const;
|
||||
EFilterType filter) const;
|
||||
|
||||
public:
|
||||
CAuiImagePane(const CGuiWidgetParms& parms, CSimplePool* sp, CAssetId, CAssetId,
|
||||
|
|
Loading…
Reference in New Issue