From bcbb85b1dd0d049c4744e9d5c02d5dd02d1bfcff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 3 Feb 2023 22:59:23 -0300 Subject: [PATCH] Add Weapon::ModifyBobLayer , Weapon::ModifyBobLayer3D and Weapon::ModifyBobPivotLayer3D --- src/rendering/hwrenderer/scene/hw_weapon.cpp | 82 +++++++++++++++++++ .../zscript/actors/inventory/weapons.zs | 6 ++ 2 files changed, 88 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_weapon.cpp b/src/rendering/hwrenderer/scene/hw_weapon.cpp index 5d9f44d7cf..58c0824a5a 100644 --- a/src/rendering/hwrenderer/scene/hw_weapon.cpp +++ b/src/rendering/hwrenderer/scene/hw_weapon.cpp @@ -47,6 +47,8 @@ #include "hw_lightbuffer.h" #include "hw_renderstate.h" +#include "vm.h" + EXTERN_CVAR(Float, transsouls) EXTERN_CVAR(Int, gl_fuzztype) EXTERN_CVAR(Bool, r_drawplayersprites) @@ -671,6 +673,10 @@ bool HUDSprite::GetWeaponRect(HWDrawInfo *di, DPSprite *psp, float sx, float sy, //========================================================================== void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) { + static PClass * wpCls = PClass::FindClass("Weapon"); + static unsigned ModifyBobLayerVIndex = GetVirtualIndex(wpCls, "ModifyBobLayer"); + static VMFunction * ModifyBobLayerOrigFunc = wpCls->Virtuals.Size() > ModifyBobLayerVIndex ? wpCls->Virtuals[ModifyBobLayerVIndex] : nullptr; + AActor * playermo = players[consoleplayer].camera; player_t * player = playermo->player; @@ -681,6 +687,17 @@ void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) WeaponPosition2D weap = GetWeaponPosition2D(camera->player, vp.TicFrac); WeaponLighting light = GetWeaponLighting(viewsector, vp.Pos, isFullbrightScene(), in_area, camera->Pos()); + VMFunction * ModifyBobLayer = nullptr; + DVector2 bobxy = DVector2(weap.bobx , weap.boby); + + if(weap.weapon) + { + PClass * cls = weap.weapon->GetCaller()->GetClass(); + ModifyBobLayer = cls->Virtuals.Size() > ModifyBobLayerVIndex ? cls->Virtuals[ModifyBobLayerVIndex] : nullptr; + + if( ModifyBobLayer == ModifyBobLayerOrigFunc) ModifyBobLayer = nullptr; + } + // hack alert! Rather than changing everything in the underlying lighting code let's just temporarily change // light mode here to draw the weapon sprite. auto oldlightmode = lightmode; @@ -702,6 +719,18 @@ void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) if (!hudsprite.GetWeaponRenderStyle(psp, camera, viewsector, light)) continue; + if(ModifyBobLayer && (psp->Flags & PSPF_ADDBOB)) + { + DVector2 out; + VMValue param[] = { weap.weapon->GetCaller() , bobxy.X , bobxy.Y , psp->GetID() , vp.TicFrac }; + VMReturn ret(&out); + + VMCall(ModifyBobLayer, param, 5, &ret, 1); + + weap.bobx = out.X; + weap.boby = out.Y; + } + FVector2 spos = BobWeapon2D(weap, psp, vp.TicFrac); hudsprite.dynrgb[0] = hudsprite.dynrgb[1] = hudsprite.dynrgb[2] = 0; @@ -720,6 +749,14 @@ void HWDrawInfo::PreparePlayerSprites2D(sector_t * viewsector, area_t in_area) void HWDrawInfo::PreparePlayerSprites3D(sector_t * viewsector, area_t in_area) { + static PClass * wpCls = PClass::FindClass("Weapon"); + + static unsigned ModifyBobLayer3DVIndex = GetVirtualIndex(wpCls, "ModifyBobLayer3D"); + static unsigned ModifyBobPivotLayer3DVIndex = GetVirtualIndex(wpCls, "ModifyBobPivotLayer3D"); + + static VMFunction * ModifyBobLayer3DOrigFunc = wpCls->Virtuals.Size() > ModifyBobLayer3DVIndex ? wpCls->Virtuals[ModifyBobLayer3DVIndex] : nullptr; + static VMFunction * ModifyBobPivotLayer3DOrigFunc = wpCls->Virtuals.Size() > ModifyBobPivotLayer3DVIndex ? wpCls->Virtuals[ModifyBobPivotLayer3DVIndex] : nullptr; + AActor * playermo = players[consoleplayer].camera; player_t * player = playermo->player; @@ -730,6 +767,23 @@ void HWDrawInfo::PreparePlayerSprites3D(sector_t * viewsector, area_t in_area) WeaponPosition3D weap = GetWeaponPosition3D(camera->player, vp.TicFrac); WeaponLighting light = GetWeaponLighting(viewsector, vp.Pos, isFullbrightScene(), in_area, camera->Pos()); + VMFunction * ModifyBobLayer3D = nullptr; + VMFunction * ModifyBobPivotLayer3D = nullptr; + + DVector3 translation = DVector3(weap.translation); + DVector3 rotation = DVector3(weap.rotation); + DVector3 pivot = DVector3(weap.pivot); + + if(weap.weapon) + { + PClass * cls = weap.weapon->GetCaller()->GetClass(); + ModifyBobLayer3D = cls->Virtuals.Size() > ModifyBobLayer3DVIndex ? cls->Virtuals[ModifyBobLayer3DVIndex] : nullptr; + ModifyBobPivotLayer3D = cls->Virtuals.Size() > ModifyBobPivotLayer3DVIndex ? cls->Virtuals[ModifyBobPivotLayer3DVIndex] : nullptr; + + if( ModifyBobLayer3D == ModifyBobLayer3DOrigFunc) ModifyBobLayer3D = nullptr; + if( ModifyBobPivotLayer3D == ModifyBobPivotLayer3DOrigFunc) ModifyBobPivotLayer3D = nullptr; + } + // hack alert! Rather than changing everything in the underlying lighting code let's just temporarily change // light mode here to draw the weapon sprite. auto oldlightmode = lightmode; @@ -748,6 +802,34 @@ void HWDrawInfo::PreparePlayerSprites3D(sector_t * viewsector, area_t in_area) hudsprite.mframe = smf; hudsprite.weapon = psp; + if(ModifyBobLayer3D && (psp->Flags & PSPF_ADDBOB)) + { + DVector3 t, r; + + VMReturn returns[2]; + + returns[0].Vec3At(&t); + returns[1].Vec3At(&r); + + VMValue param[] = { weap.weapon->GetCaller() , translation.X, translation.Y, translation.Z, rotation.X, rotation.Y, rotation.Z, psp->GetID() , vp.TicFrac }; + VMCall(ModifyBobLayer3D, param, 9, returns, 2); + + weap.translation = FVector3(t); + weap.rotation = FVector3(r); + } + + if(ModifyBobPivotLayer3D && (psp->Flags & PSPF_ADDBOB)) + { + DVector3 p; + + VMReturn ret(&p); + + VMValue param[] = { weap.weapon->GetCaller() , pivot.X, pivot.Y, pivot.Z, psp->GetID() , vp.TicFrac }; + VMCall(ModifyBobPivotLayer3D, param, 6, &ret, 1); + + weap.pivot = FVector3(p); + } + if (!hudsprite.GetWeaponRenderStyle(psp, camera, viewsector, light)) continue; //FVector2 spos = BobWeapon3D(weap, psp, hudsprite.translation, hudsprite.rotation, hudsprite.pivot, vp.TicFrac); diff --git a/wadsrc/static/zscript/actors/inventory/weapons.zs b/wadsrc/static/zscript/actors/inventory/weapons.zs index 72f31b1f9e..ca5031de7e 100644 --- a/wadsrc/static/zscript/actors/inventory/weapons.zs +++ b/wadsrc/static/zscript/actors/inventory/weapons.zs @@ -39,6 +39,12 @@ class Weapon : StateProvider meta double SlotPriority; Vector3 BobPivot3D; // Pivot used for BobWeapon3D + + virtual ui Vector2 ModifyBobLayer(Vector2 Bob, int layer, double ticfrac) { return Bob; } + + virtual ui Vector3, Vector3 ModifyBobLayer3D(Vector3 Translation, Vector3 Rotation, int layer, double ticfrac) { return Translation, Rotation; } + + virtual ui Vector3 ModifyBobPivotLayer3D(int layer, double ticfrac) { return BobPivot3D; } property AmmoGive: AmmoGive1; property AmmoGive1: AmmoGive1;