docs: add plugin setup guide

This commit is contained in:
2026-05-30 18:33:24 +12:00
parent f3db41c402
commit b61043a3fe
1776 changed files with 122386 additions and 2 deletions
@@ -0,0 +1,165 @@
#pragma once
#include "RE/B/BSFixedString.h"
#include "RE/B/BSSpinLock.h"
#include "RE/N/NiShadeProperty.h"
namespace RE
{
class BSEffectShaderData;
class BSRenderPass;
class BSShaderAccumulator;
class BSShaderMaterial;
class NiTexture;
class __declspec(novtable) BSShaderProperty :
public NiShadeProperty // 00
{
private:
static constexpr auto BIT64 = static_cast<std::uint64_t>(1);
public:
static constexpr auto RTTI{ RTTI::BSShaderProperty };
static constexpr auto VTABLE{ VTABLE::BSShaderProperty };
static constexpr auto Ni_RTTI{ Ni_RTTI::BSShaderProperty };
enum class TextureTypeEnum
{
kBase = 0x0,
kNormal = 0x1,
kGlow = 0x2,
kHeight = 0x3,
kEnv = 0x4,
kWrinkles = 0x5,
kMultilayer = 0x6,
kBacklightMask = 0x7,
kSmoothSpec = kBacklightMask,
kTotal
};
enum class EShaderPropertyFlag : std::uint64_t
{
kSpecular = BIT64 << 0,
kSkinned = BIT64 << 1,
kTempRefraction = BIT64 << 2,
kVertexAlpha = BIT64 << 3,
kGrayscaleToPaletteColor = BIT64 << 4,
kGrayscaleToPaletteAlpha = BIT64 << 5,
kFalloff = BIT64 << 6,
kEnvMap = BIT64 << 7,
kRGBFalloff = BIT64 << 8,
kCastShadows = BIT64 << 9,
kFace = BIT64 << 10,
kUIMaskRects = BIT64 << 11,
kModelSpaceNormals = BIT64 << 12,
kRefractionClamp = BIT64 << 13,
kMultiTextureLandscape = BIT64 << 14,
kRefraction = BIT64 << 15,
kRefractionFalloff = BIT64 << 16,
kEyeReflect = BIT64 << 17,
kHairTint = BIT64 << 18,
kScreendoorAlphaFade = BIT64 << 19,
kLocalMapClear = BIT64 << 20,
kFaceGenRGBTint = BIT64 << 21,
kOwnEmit = BIT64 << 22,
kProjectedUV = BIT64 << 23,
kMultipleTextures = BIT64 << 24,
kTesselate = BIT64 << 25,
kDecal = BIT64 << 26,
kDynamicDecal = BIT64 << 27,
kCharacterLight = BIT64 << 28,
kExternalEmittance = BIT64 << 29,
kSoftEffect = BIT64 << 30,
kZBufferTest = BIT64 << 31,
kZBufferWrite = BIT64 << 32,
kLODLandscape = BIT64 << 33,
kLODObjects = BIT64 << 34,
kNoFade = BIT64 << 35,
kTwoSided = BIT64 << 36,
kVertexColors = BIT64 << 37,
kGlowMap = BIT64 << 38,
kTransformChanged = BIT64 << 39,
kDismembermentMeatCuff = BIT64 << 40,
kTint = BIT64 << 41,
kVertexLighting = BIT64 << 42,
kUniformScale = BIT64 << 43,
kFitSlope = BIT64 << 44,
kBillboard = BIT64 << 45,
kLODLandBlend = BIT64 << 46,
kDismemberment = BIT64 << 47,
kWireframe = BIT64 << 48,
kWeaponBlood = BIT64 << 49,
kHideOnLocalMap = BIT64 << 50,
kPremultAlpha = BIT64 << 51,
kVATSTarget = BIT64 << 52,
kAnisotropicLighting = BIT64 << 53,
kSkewSpecularAlpha = BIT64 << 54,
kMenuScreen = BIT64 << 55,
kMultiLayerParallax = BIT64 << 56,
kAlphaTest = BIT64 << 57,
kInvertedFadePattern = BIT64 << 58,
kVATSTargetDrawAll = BIT64 << 59,
kPipboyScreen = BIT64 << 60,
kTreeAnim = BIT64 << 61,
kEffectLighting = BIT64 << 62,
kRefractionWritesDepth = BIT64 << 63
};
class ForEachVisitor;
class RenderPassArray
{
public:
constexpr RenderPassArray() noexcept {} // NOLINT(modernize-use-equals-default)
// members
BSRenderPass* passList{ nullptr }; // 0
};
static_assert(sizeof(RenderPassArray) == 0x8);
// add
virtual RenderPassArray* GetRenderPasses(BSGeometry* a_geom, std::uint32_t a_renderMode, BSShaderAccumulator* a_accumulator) = 0; // 2B
virtual RenderPassArray* GetRenderPasses_ShadowMapOrMask(BSGeometry*, std::uint32_t, BSShaderAccumulator*) { return nullptr; } // 2C
virtual RenderPassArray* GetRenderPasses_LocalMap(BSGeometry*, std::uint32_t, BSShaderAccumulator*) { return nullptr; } // 2D
virtual BSRenderPass* CreateVatsMaskRenderPass(BSGeometry*) { return nullptr; } // 2E
virtual std::uint16_t GetNumberofPasses([[maybe_unused]] BSGeometry* a_geom) { return 1; } // 2F
virtual BSRenderPass* GetRenderDepthPass(BSGeometry*) { return nullptr; } // 30
virtual bool CanMerge(const BSShaderProperty* a_prop); // 31
virtual void SetMaterialAlpha(float) { return; } // 32
virtual float QMaterialAlpha() const { return 1.0F; } // 33
virtual const BSFixedString& GetRootName() const; // 34
virtual std::int32_t ForEachTexture(ForEachVisitor&) { return 1; } // 35
virtual std::int32_t QShader() const { return 0; } // 36
virtual void ClearUnusedMaterialValues() { return; } // 37
virtual BSShaderProperty* ClarifyShader(BSGeometry*, bool, bool) { return nullptr; } // 38
virtual NiTexture* GetBaseTexture() const { return nullptr; } // 39
virtual RenderPassArray* GetWaterFogPassList(BSGeometry*) { return nullptr; } // 3A
virtual bool AcceptsEffectData() const { return false; } // 3B
virtual void PrecacheTextures() { return; } // 3C
virtual std::uint32_t DetermineUtilityShaderDecl() const { return 0; } // 3D
virtual std::uint32_t GetMaterialType() const { return 0; } // 3E
virtual void DoClearRenderPasses() { return; } // 3F
void SetMaterial(BSShaderMaterial* a_material, bool a_unique)
{
using func_t = decltype(&BSShaderProperty::SetMaterial);
static REL::Relocation<func_t> func{ ID::BSShaderProperty::SetMaterial };
return func(this, a_material, a_unique);
}
// members
float alpha; // 28
std::int32_t lastRenderPassState; // 2C
REX::TEnumSet<EShaderPropertyFlag, std::uint64_t> flags; // 30
RenderPassArray renderPassList; // 38
RenderPassArray debugRenderPassList; // 40
BSFadeNode* fadeNode; // 48
BSEffectShaderData* effectData; // 50
BSShaderMaterial* material; // 58
std::uint32_t lastAccumTime; // 60
float lodFade; // 64
BSNonReentrantSpinLock clearRenderPassesLock; // 68
};
static_assert(sizeof(BSShaderProperty) == 0x70);
}