4
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

166 lines
5.4 KiB

#include "skse64/NiGeometry.h"
#include "skse64/GameAPI.h"
// 4772884F2DDD41847925EAA949727085D82940A1+401
RelocAddr<_CreateBSTriShape> CreateBSTriShape(0x00C90560);
// 4772884F2DDD41847925EAA949727085D82940A1+414
RelocAddr<_CreateBSDynamicTriShape> CreateBSDynamicTriShape(0x00C9B850);
// ??_7NiTriShape@@6B@
static const RelocPtr<uintptr_t> s_NiTriShapeVtbl(0x0185E998);
// ??_7NiTriStrips@@6B@
static const RelocPtr<uintptr_t> s_NiTriStripsVtbl(0x0185EF50);
void NiGeometryData::AllocateVerts(UInt32 numVerts)
{
m_pkVertex = (NiPoint3 *)Heap_Allocate(sizeof(NiPoint3) * numVerts);
m_pkTexture = (NiPoint2 *)Heap_Allocate(sizeof(NiPoint2) * numVerts);
memset(m_pkVertex, 0, sizeof(NiPoint3) * numVerts);
memset(m_pkTexture, 0, sizeof(NiPoint2) * numVerts);
}
void NiGeometryData::AllocateNormals(UInt32 numVerts)
{
m_pkNormal = (NiPoint3 *)Heap_Allocate(sizeof(NiPoint3) * numVerts);
memset(m_pkNormal, 0, sizeof(NiPoint3) * numVerts);
}
void NiGeometryData::AllocateNBT(UInt32 numVerts)
{
m_pkNormal = (NiPoint3 *)Heap_Allocate(sizeof(NiPoint3) * 3 * numVerts);
memset(m_pkNormal, 0, sizeof(NiPoint3) * 3 * numVerts);
}
void NiGeometryData::AllocateColors(UInt32 numVerts)
{
m_pkColor = (NiColorA *)Heap_Allocate(sizeof(NiColorA) * numVerts);
memset(m_pkColor, 0, sizeof(NiColorA) * numVerts);
}
void NiSkinPartition::Partition::AllocateWeights(UInt32 numVerts)
{
m_pfWeights = (float *)Heap_Allocate(sizeof(float) * 4 * numVerts);
m_pucBonePalette = (UInt8 *)Heap_Allocate(sizeof(UInt8) * 4 * numVerts);
memset(m_pfWeights, 0, sizeof(float) * 4 * numVerts);
memset(m_pucBonePalette, 0, sizeof(UInt8) * 4 * numVerts);
}
void NiSkinData::BoneData::AllocateWeights(UInt32 numWeights)
{
m_pkBoneVertData = (BoneVertData *)Heap_Allocate(sizeof(BoneVertData) * numWeights);
memset(m_pkBoneVertData, 0, sizeof(BoneVertData) * numWeights);
}
NiSkinInstance * NiSkinInstance::Create()
{
void* memory = Heap_Allocate(sizeof(NiSkinInstance));
memset(memory, 0, sizeof(NiSkinInstance));
NiSkinInstance* xData = (NiSkinInstance*)memory;
CALL_MEMBER_FN(xData, ctor)();
return xData;
}
BSDismemberSkinInstance * BSDismemberSkinInstance::Create()
{
typedef BSDismemberSkinInstance * (*_BSDismemberSkinInstance_Create)();
// 4772884F2DDD41847925EAA949727085D82940A1+2E4
static RelocAddr <_BSDismemberSkinInstance_Create> BSDismemberSkinInstance_Create(0x00C947A0);
return BSDismemberSkinInstance_Create();
}
NiTriShape * NiTriShape::Create(NiTriShapeData * geometry)
{
void* memory = Heap_Allocate(sizeof(NiTriShape));
memset(memory, 0, sizeof(NiTriShape));
NiTriShape* xData = (NiTriShape*)memory;
xData->ctor(geometry);
((uintptr_t *)memory)[0] = s_NiTriShapeVtbl.GetUIntPtr();
return xData;
}
NiTriStrips * NiTriStrips::Create(NiTriShapeData * geometry)
{
void* memory = Heap_Allocate(sizeof(NiTriStrips));
memset(memory, 0, sizeof(NiTriStrips));
NiTriStrips* xData = (NiTriStrips*)memory;
xData->ctor(geometry);
((uintptr_t *)memory)[0] = s_NiTriStripsVtbl.GetUIntPtr();
return xData;
}
NiSkinInstance * NiSkinInstance::Clone()
{
NiSkinInstance * newSkinInstance = nullptr;
EnterCriticalSection(&lock);
BSDismemberSkinInstance* srcSkin = ni_cast(this, BSDismemberSkinInstance);
if (srcSkin)
{
newSkinInstance = BSDismemberSkinInstance::Create();
BSDismemberSkinInstance* dstSkin = ni_cast(newSkinInstance, BSDismemberSkinInstance);
dstSkin->numPartitions = srcSkin->numPartitions;
dstSkin->partitionFlags = (UInt32 *)Heap_Allocate(sizeof(UInt32) * srcSkin->numPartitions);
memcpy(dstSkin->partitionFlags, srcSkin->partitionFlags, sizeof(UInt32) * srcSkin->numPartitions);
dstSkin->unk98 = srcSkin->unk98;
memcpy(dstSkin->pad99, srcSkin->pad99, 7);
}
else
{
newSkinInstance = NiSkinInstance::Create();
}
newSkinInstance->m_spSkinData = m_spSkinData;
newSkinInstance->m_spSkinPartition = m_spSkinPartition;
newSkinInstance->m_pkRootParent = m_pkRootParent;
newSkinInstance->m_ppkBones = (NiAVObject**)Heap_Allocate(sizeof(NiAVObject*) * m_uiBoneNodes);
memcpy(newSkinInstance->m_ppkBones, this->m_ppkBones, sizeof(NiAVObject*) * m_uiBoneNodes);
newSkinInstance->unk38 = unk38;
newSkinInstance->m_uiBoneNodes = m_uiBoneNodes;
newSkinInstance->numFlags = numFlags;
if (flags) {
newSkinInstance->flags = (UInt32 *)Heap_Allocate(sizeof(UInt32) * numFlags);
}
else {
flags = nullptr;
}
newSkinInstance->unk44 = unk44;
memcpy(newSkinInstance->flags, flags, sizeof(UInt32) * numFlags);
if (unk50) {
newSkinInstance->unk50 = (UInt32 *)Heap_Allocate(sizeof(UInt32) * numFlags);
memcpy(newSkinInstance->unk50, unk50, sizeof(UInt32) * numFlags);
}
else {
unk50 = nullptr;
}
NiSkinData * skinData = niptr_cast<NiSkinData>(newSkinInstance->m_spSkinData);
if (skinData) {
newSkinInstance->m_worldTransforms = (NiTransform**)Heap_Allocate(sizeof(NiTransform*) * skinData->m_uiBones);
memcpy(newSkinInstance->m_worldTransforms, this->m_worldTransforms, sizeof(NiTransform*) * skinData->m_uiBones);
}
#if 0
else
{
if (!newSkinInstance->flags && numFlags > 0)
{
newSkinInstance->numFlags = numFlags;
newSkinInstance->flags = (UInt32 *)Heap_Allocate(sizeof(UInt32) * numFlags);
memcpy(newSkinInstance->flags, flags, sizeof(UInt32) * numFlags);
}
newSkinInstance->m_uiBoneNodes = m_uiBoneNodes;
newSkinInstance->unk38 = unk38;
newSkinInstance->unk44 = unk44;
newSkinInstance->unk50 = unk50;
newSkinInstance->unk54 = unk54;
}
#endif
LeaveCriticalSection(&lock);
return newSkinInstance;
}