mirror of https://github.com/AxioDL/metaforce.git
First skybox and HUD rendering
This commit is contained in:
parent
744a934115
commit
742ab2514f
|
@ -15,14 +15,14 @@ struct VisorGoo : IScriptObject
|
|||
String<-1> name;
|
||||
Value<atVec3f> position;
|
||||
UniqueID32 particle;
|
||||
Value<atUint32> unknown1; // always FF
|
||||
Value<float> unknown2;
|
||||
Value<float> unknown3;
|
||||
Value<float> unknown4;
|
||||
Value<float> unknown5;
|
||||
Value<atVec4f> unknown6; // CColor
|
||||
Value<atUint32> unknown7;
|
||||
Value<bool> unknown8;
|
||||
UniqueID32 electric;
|
||||
Value<float> minDist;
|
||||
Value<float> maxDist;
|
||||
Value<float> nearProb;
|
||||
Value<float> farProb;
|
||||
DNAColor color;
|
||||
Value<atUint32> sfx;
|
||||
Value<bool> skipAngleTest;
|
||||
|
||||
void nameIDs(PAKRouter<PAKBridge>& pakRouter) const
|
||||
{
|
||||
|
@ -31,11 +31,17 @@ struct VisorGoo : IScriptObject
|
|||
PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(particle);
|
||||
ent->name = name + "_part";
|
||||
}
|
||||
if (electric)
|
||||
{
|
||||
PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(electric);
|
||||
ent->name = name + "_elsc";
|
||||
}
|
||||
}
|
||||
|
||||
void gatherDependencies(std::vector<hecl::ProjectPath>& pathsOut) const
|
||||
{
|
||||
g_curSpec->flattenDependencies(particle, pathsOut);
|
||||
g_curSpec->flattenDependencies(electric, pathsOut);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ namespace urde
|
|||
void ViewManager::InitMP1(MP1::CMain& main)
|
||||
{
|
||||
main.Init(m_fileStoreManager, m_mainWindow.get(), m_voiceEngine.get(), *m_amuseAllocWrapper);
|
||||
if (!m_noShaderWarmup)
|
||||
main.WarmupShaders();
|
||||
|
||||
m_testGameView.reset(new TestGameView(*this, m_viewResources, *m_rootView));
|
||||
|
@ -218,11 +219,10 @@ void ViewManager::init(boo::IApplication* app)
|
|||
|
||||
for (const auto& arg : app->getArgs())
|
||||
{
|
||||
if (hecl::SearchForProject(arg))
|
||||
{
|
||||
if (m_deferedProject.empty() && hecl::SearchForProject(arg))
|
||||
m_deferedProject = arg;
|
||||
break;
|
||||
}
|
||||
if (arg == _S("--no-shader-warmup"))
|
||||
m_noShaderWarmup = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -148,6 +148,7 @@ class ViewManager : public specter::IViewManager
|
|||
int m_deferSplitThisSlot;
|
||||
boo::SWindowCoord m_deferSplitCoord;
|
||||
hecl::SystemString m_deferedProject;
|
||||
bool m_noShaderWarmup = false;
|
||||
|
||||
public:
|
||||
ViewManager(hecl::Runtime::FileStoreManager& fileMgr, hecl::CVarManager& cvarMgr);
|
||||
|
|
|
@ -329,6 +329,8 @@ float CSfxManager::GetReverbAmount()
|
|||
|
||||
void CSfxManager::PitchBend(const CSfxHandle& handle, float pitch)
|
||||
{
|
||||
if (!handle)
|
||||
return;
|
||||
if (!handle->IsPlaying())
|
||||
CSfxManager::Update(0.f);
|
||||
if (handle->IsPlaying())
|
||||
|
@ -340,6 +342,8 @@ void CSfxManager::PitchBend(const CSfxHandle& handle, float pitch)
|
|||
|
||||
void CSfxManager::SfxVolume(const CSfxHandle& handle, float vol)
|
||||
{
|
||||
if (!handle)
|
||||
return;
|
||||
if (handle->IsEmitter())
|
||||
{
|
||||
CSfxWrapper& wrapper = static_cast<CSfxWrapper&>(*handle);
|
||||
|
@ -351,6 +355,8 @@ void CSfxManager::SfxVolume(const CSfxHandle& handle, float vol)
|
|||
|
||||
void CSfxManager::SfxSpan(const CSfxHandle& handle, float span)
|
||||
{
|
||||
if (!handle)
|
||||
return;
|
||||
if (handle->IsPlaying())
|
||||
handle->GetVoice()->setSurroundPan(span);
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ void CMapArea::PostConstruct()
|
|||
|
||||
CGraphics::CommitResources([this, &index](boo::IGraphicsDataFactory::Context& ctx)
|
||||
{
|
||||
m_vbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, x3c_vertexStart, 12, x2c_vertexCount);
|
||||
m_vbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, m_verts.data(), 16, m_verts.size());
|
||||
m_ibo = ctx.newStaticBuffer(boo::BufferUse::Index, index.data(), 4, index.size());
|
||||
|
||||
/* Only the map universe specifies Always; it draws a maximum of 133 instances */
|
||||
|
@ -206,6 +206,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
x1c_outlineOffset = buf + reinterpret_cast<uintptr_t>(x1c_outlineOffset);
|
||||
|
||||
m_primStart = index.size();
|
||||
bool start = true;
|
||||
{
|
||||
athena::io::MemoryReader r(x18_surfOffset, INT_MAX);
|
||||
u32 primCount = r.readUint32Big();
|
||||
|
@ -219,7 +220,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
{
|
||||
for (u32 v=0 ; v<count ; v+=3)
|
||||
{
|
||||
if (index.size())
|
||||
if (!start)
|
||||
{
|
||||
index.push_back(index.back());
|
||||
index.push_back(r.readUByte());
|
||||
|
@ -228,6 +229,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
else
|
||||
{
|
||||
index.push_back(r.readUByte());
|
||||
start = false;
|
||||
}
|
||||
index.push_back(r.readUByte());
|
||||
index.push_back(r.readUByte());
|
||||
|
@ -237,7 +239,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
}
|
||||
case GX::Primitive::TRIANGLESTRIP:
|
||||
{
|
||||
if (index.size())
|
||||
if (!start)
|
||||
{
|
||||
index.push_back(index.back());
|
||||
index.push_back(r.readUByte());
|
||||
|
@ -246,6 +248,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
else
|
||||
{
|
||||
index.push_back(r.readUByte());
|
||||
start = false;
|
||||
}
|
||||
for (u32 v=1 ; v<count ; ++v)
|
||||
index.push_back(r.readUByte());
|
||||
|
@ -256,7 +259,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
case GX::Primitive::TRIANGLEFAN:
|
||||
{
|
||||
u8 firstVert = r.readUByte();
|
||||
if (index.size())
|
||||
if (!start)
|
||||
{
|
||||
index.push_back(index.back());
|
||||
index.push_back(r.readUByte());
|
||||
|
@ -265,6 +268,7 @@ void CMapArea::CMapAreaSurface::PostConstruct(const u8* buf, std::vector<u32>& i
|
|||
{
|
||||
index.push_back(r.readUByte());
|
||||
index.push_back(index.back());
|
||||
start = false;
|
||||
}
|
||||
for (u32 v=1 ; v<count ; ++v)
|
||||
{
|
||||
|
@ -315,6 +319,7 @@ void CMapArea::CMapAreaSurface::Draw(const zeus::CVector3f* verts, const zeus::C
|
|||
u8 idx = r.readUByte();
|
||||
prim.AddVertex(verts[idx], color, width);
|
||||
}
|
||||
r.seekAlign4();
|
||||
prim.Render();
|
||||
}
|
||||
width -= 1.f;
|
||||
|
|
|
@ -49,7 +49,7 @@ void CObjectList::RemoveObject(TUniqueId uid)
|
|||
const CEntity* CObjectList::operator[](size_t i) const
|
||||
{
|
||||
const SObjectListEntry& ent = x0_list[i];
|
||||
if (ent.entity->x30_26_scriptingBlocked)
|
||||
if (!ent.entity || ent.entity->x30_26_scriptingBlocked)
|
||||
return nullptr;
|
||||
return ent.entity;
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ const CEntity* CObjectList::operator[](size_t i) const
|
|||
CEntity* CObjectList::operator[](size_t i)
|
||||
{
|
||||
SObjectListEntry& ent = x0_list[i];
|
||||
if (ent.entity->x30_26_scriptingBlocked)
|
||||
if (!ent.entity || ent.entity->x30_26_scriptingBlocked)
|
||||
return nullptr;
|
||||
return ent.entity;
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ const CEntity* CObjectList::GetObjectById(TUniqueId uid) const
|
|||
if (uid == kInvalidUniqueId)
|
||||
return nullptr;
|
||||
const SObjectListEntry& ent = x0_list[uid.Value()];
|
||||
if (ent.entity->x30_26_scriptingBlocked)
|
||||
if (!ent.entity || ent.entity->x30_26_scriptingBlocked)
|
||||
return nullptr;
|
||||
return ent.entity;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ CEntity* CObjectList::GetObjectById(TUniqueId uid)
|
|||
if (uid == kInvalidUniqueId)
|
||||
return nullptr;
|
||||
SObjectListEntry& ent = x0_list[uid.Value()];
|
||||
if (ent.entity->x30_26_scriptingBlocked)
|
||||
if (!ent.entity || ent.entity->x30_26_scriptingBlocked)
|
||||
return nullptr;
|
||||
return ent.entity;
|
||||
}
|
||||
|
|
|
@ -696,6 +696,7 @@ void CStateManager::DrawWorld() const
|
|||
SetupFogForArea(area);
|
||||
g_Renderer->EnablePVS(pvsArr[i], area.x4_selfIdx);
|
||||
g_Renderer->SetWorldLightFadeLevel(area.GetPostConstructed()->x1128_worldLightingLevel);
|
||||
g_Renderer->UpdateAreaUniforms(area.x4_selfIdx);
|
||||
g_Renderer->DrawUnsortedGeometry(area.x4_selfIdx, mask, targetMask);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,13 +20,15 @@
|
|||
namespace urde
|
||||
{
|
||||
|
||||
static rstl::reserved_vector<CDrawable, 50> sDataHolder;
|
||||
static logvisor::Module Log("CBooRenderer");
|
||||
|
||||
static rstl::reserved_vector<CDrawable, 512> sDataHolder;
|
||||
static rstl::reserved_vector<rstl::reserved_vector<CDrawable*, 128>, 50> sBucketsHolder;
|
||||
static rstl::reserved_vector<CDrawablePlaneObject, 8> sPlaneObjectDataHolder;
|
||||
static rstl::reserved_vector<u16, 8> sPlaneObjectBucketHolder;
|
||||
|
||||
rstl::reserved_vector<u16, 50> Buckets::sBucketIndex;
|
||||
rstl::reserved_vector<CDrawable, 50>* Buckets::sData = nullptr;
|
||||
rstl::reserved_vector<CDrawable, 512>* Buckets::sData = nullptr;
|
||||
rstl::reserved_vector<rstl::reserved_vector<CDrawable*, 128>, 50>* Buckets::sBuckets = nullptr;
|
||||
rstl::reserved_vector<CDrawablePlaneObject, 8>* Buckets::sPlaneObjectData = nullptr;
|
||||
rstl::reserved_vector<u16, 8>* Buckets::sPlaneObjectBucket = nullptr;
|
||||
|
@ -48,40 +50,73 @@ void Buckets::Clear()
|
|||
void Buckets::Sort()
|
||||
{
|
||||
float delta = std::max(1.f, sMinMaxDistance[1] - sMinMaxDistance[0]);
|
||||
sPlaneObjectBucket->resize(8);
|
||||
float pitch = 49.f / delta;
|
||||
for (auto it = sPlaneObjectData->begin() ; it != sPlaneObjectData->end() ; ++it)
|
||||
if (sPlaneObjectBucket->size() < 8)
|
||||
sPlaneObjectBucket->push_back(s16(it - sPlaneObjectData->begin()));
|
||||
|
||||
u32 precision = 50;
|
||||
if (sPlaneObjectBucket->size())
|
||||
{
|
||||
std::sort(sPlaneObjectBucket->begin(), sPlaneObjectBucket->end(),
|
||||
[](u16 a, u16 b) -> bool
|
||||
{
|
||||
return (*sPlaneObjectData)[a].GetDistance() >= (*sPlaneObjectData)[b].GetDistance();
|
||||
});
|
||||
|
||||
u32 precision = 50 / (8 + 1);
|
||||
float pitch = 1.f / (delta / float(precision - 2));
|
||||
precision = 50 / u32(sPlaneObjectBucket->size() + 1);
|
||||
pitch = 1.f / (delta / float(precision - 2));
|
||||
|
||||
int accum = 0;
|
||||
for (u16 idx : *sPlaneObjectBucket)
|
||||
{
|
||||
++accum;
|
||||
CDrawablePlaneObject& planeObj = (*sPlaneObjectData)[idx];
|
||||
planeObj.x24_targetBucket = precision * accum;
|
||||
planeObj.x24_targetBucket = u16(precision * accum);
|
||||
}
|
||||
}
|
||||
|
||||
for (CDrawable& drawable : *sData)
|
||||
{
|
||||
int slot;
|
||||
float relDist = drawable.GetDistance() - sMinMaxDistance[0];
|
||||
if (sPlaneObjectBucket->empty())
|
||||
{
|
||||
slot = zeus::clamp(1, int((drawable.GetDistance() - sMinMaxDistance[0]) * pitch), 49);
|
||||
slot = zeus::clamp(1, int(relDist * pitch), 49);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: Planar sort distribution */
|
||||
slot = zeus::clamp(0, int(relDist * pitch), int(precision) - 2);
|
||||
for (u16 idx : *sPlaneObjectBucket)
|
||||
{
|
||||
CDrawablePlaneObject& planeObj = (*sPlaneObjectData)[idx];
|
||||
bool partial, full;
|
||||
if (planeObj.x3c_25_zOnly)
|
||||
{
|
||||
partial = drawable.GetBounds().max.z > planeObj.GetPlane().d;
|
||||
full = drawable.GetBounds().min.z > planeObj.GetPlane().d;
|
||||
}
|
||||
else
|
||||
{
|
||||
partial = planeObj.GetPlane().pointToPlaneDist(
|
||||
drawable.GetBounds().closestPointAlongVector(planeObj.GetPlane().vec)) > 0.f;
|
||||
full = planeObj.GetPlane().pointToPlaneDist(
|
||||
drawable.GetBounds().furthestPointAlongVector(planeObj.GetPlane().vec)) > 0.f;
|
||||
}
|
||||
bool cont;
|
||||
if (drawable.GetType() == EDrawableType::Particle)
|
||||
cont = planeObj.x3c_24_invertTest ? !partial : full;
|
||||
else
|
||||
cont = planeObj.x3c_24_invertTest ? (!partial || !full) : (partial || full);
|
||||
if (!cont)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (slot == -1)
|
||||
slot = 49;
|
||||
(*sBuckets)[slot].push_back(&drawable);
|
||||
rstl::reserved_vector<CDrawable*, 128>& bucket = (*sBuckets)[slot];
|
||||
if (bucket.size() < bucket.capacity())
|
||||
bucket.push_back(&drawable);
|
||||
}
|
||||
|
||||
int bucketIdx = sBuckets->size();
|
||||
|
@ -108,14 +143,16 @@ void Buckets::Sort()
|
|||
}
|
||||
}
|
||||
|
||||
void Buckets::InsertPlaneObject(float dist, float something, const zeus::CAABox& aabb, bool b1,
|
||||
const zeus::CPlane& plane, bool b2, EDrawableType dtype, const void* data)
|
||||
void Buckets::InsertPlaneObject(float dist, float something, const zeus::CAABox& aabb, bool invertTest,
|
||||
const zeus::CPlane& plane, bool zOnly, EDrawableType dtype, const void* data)
|
||||
{
|
||||
sPlaneObjectData->push_back(CDrawablePlaneObject(dtype, dist, something, aabb, b1, plane, b2, data));
|
||||
sPlaneObjectData->push_back(CDrawablePlaneObject(dtype, dist, something, aabb, invertTest, plane, zOnly, data));
|
||||
}
|
||||
|
||||
void Buckets::Insert(const zeus::CVector3f& pos, const zeus::CAABox& aabb, EDrawableType dtype,
|
||||
const void* data, const zeus::CPlane& plane, u16 extraSort)
|
||||
{
|
||||
if (sData->size() != sData->capacity())
|
||||
{
|
||||
float dist = plane.pointToPlaneDist(pos);
|
||||
sData->push_back(CDrawable(dtype, extraSort, dist, aabb, data));
|
||||
|
@ -124,6 +161,11 @@ void Buckets::Insert(const zeus::CVector3f& pos, const zeus::CAABox& aabb, EDraw
|
|||
if (sMinMaxDistance[1] < dist)
|
||||
sMinMaxDistance[1] = dist;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.report(logvisor::Fatal, "Rendering buckets filled to capacity");
|
||||
}
|
||||
}
|
||||
|
||||
void Buckets::Shutdown()
|
||||
{
|
||||
|
@ -236,12 +278,12 @@ void CBooRenderer::RenderBucketItems(CAreaListItem* item)
|
|||
}
|
||||
case EDrawableType::WorldSurface:
|
||||
{
|
||||
SetupRendererStates();
|
||||
//SetupRendererStates();
|
||||
CBooSurface* surf = static_cast<CBooSurface*>((void*)drawable->GetData());
|
||||
CBooModel* model = surf->m_parent;
|
||||
if (model)
|
||||
{
|
||||
ActivateLightsForModel(item, *model);
|
||||
//ActivateLightsForModel(item, *model);
|
||||
model->DrawSurface(*surf, flags);
|
||||
}
|
||||
break;
|
||||
|
@ -262,7 +304,7 @@ void CBooRenderer::RenderBucketItems(CAreaListItem* item)
|
|||
|
||||
void CBooRenderer::HandleUnsortedModel(CAreaListItem* item, CBooModel& model)
|
||||
{
|
||||
ActivateLightsForModel(item, model);
|
||||
//ActivateLightsForModel(item, model);
|
||||
CBooSurface* surf = model.x38_firstUnsortedSurface;
|
||||
CModelFlags flags;
|
||||
flags.m_extendedShader = EExtendedShader::Lighting;
|
||||
|
@ -677,6 +719,7 @@ CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac)
|
|||
GenerateFogVolumeRampTex(ctx);
|
||||
GenerateSphereRampTex(ctx);
|
||||
m_ballShadowId = ctx.newRenderTexture(m_ballShadowIdW, m_ballShadowIdH, boo::TextureClampMode::Repeat, 1, 0);
|
||||
x14c_reflectionTex = ctx.newRenderTexture(256, 256, boo::TextureClampMode::Repeat, 1, 0);
|
||||
GenerateScanLinesVBO(ctx);
|
||||
return true;
|
||||
});
|
||||
|
@ -745,6 +788,29 @@ void CBooRenderer::DisablePVS()
|
|||
xc8_pvs = std::experimental::nullopt;
|
||||
}
|
||||
|
||||
void CBooRenderer::UpdateAreaUniforms(int areaIdx)
|
||||
{
|
||||
SetupRendererStates();
|
||||
|
||||
for (CAreaListItem& item : x1c_areaListItems)
|
||||
{
|
||||
if (areaIdx != -1 && item.x18_areaIdx != areaIdx)
|
||||
continue;
|
||||
|
||||
for (auto it = item.x10_models.begin(); it != item.x10_models.end(); ++it)
|
||||
{
|
||||
CBooModel* model = *it;
|
||||
if (model->TryLockTextures())
|
||||
{
|
||||
ActivateLightsForModel(&item, *model);
|
||||
CModelFlags flags;
|
||||
flags.m_extendedShader = EExtendedShader::Lighting;
|
||||
model->UpdateUniformData(flags, nullptr, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CBooRenderer::RemoveStaticGeometry(const std::vector<CMetroidModelInstance>* geometry)
|
||||
{
|
||||
auto search = FindStaticGeometry(geometry);
|
||||
|
@ -755,7 +821,7 @@ void CBooRenderer::RemoveStaticGeometry(const std::vector<CMetroidModelInstance>
|
|||
void CBooRenderer::DrawAreaGeometry(int areaIdx, int mask, int targetMask)
|
||||
{
|
||||
x318_30_inAreaDraw = true;
|
||||
SetupRendererStates();
|
||||
//SetupRendererStates();
|
||||
CModelFlags flags;
|
||||
|
||||
for (CAreaListItem& item : x1c_areaListItems)
|
||||
|
@ -793,7 +859,7 @@ void CBooRenderer::DrawAreaGeometry(int areaIdx, int mask, int targetMask)
|
|||
|
||||
void CBooRenderer::DrawUnsortedGeometry(int areaIdx, int mask, int targetMask)
|
||||
{
|
||||
SetupRendererStates();
|
||||
//SetupRendererStates();
|
||||
|
||||
CAreaListItem* lastOctreeItem = nullptr;
|
||||
|
||||
|
@ -871,7 +937,7 @@ void CBooRenderer::DrawUnsortedGeometry(int areaIdx, int mask, int targetMask)
|
|||
|
||||
void CBooRenderer::DrawSortedGeometry(int areaIdx, int mask, int targetMask)
|
||||
{
|
||||
SetupRendererStates();
|
||||
//SetupRendererStates();
|
||||
|
||||
CAreaListItem* lastOctreeItem = nullptr;
|
||||
|
||||
|
@ -1327,6 +1393,7 @@ int CBooRenderer::DrawOverlappingWorldModelIDs(int alphaVal, const std::vector<u
|
|||
const zeus::CAABox& aabb) const
|
||||
{
|
||||
SetupRendererStates();
|
||||
const_cast<CBooRenderer&>(*this).UpdateAreaUniforms(-1);
|
||||
|
||||
CModelFlags flags;
|
||||
flags.m_extendedShader = EExtendedShader::SolidColor; // Do solid color draw
|
||||
|
|
|
@ -32,7 +32,7 @@ class Buckets
|
|||
friend class CBooRenderer;
|
||||
|
||||
static rstl::reserved_vector<u16, 50> sBucketIndex;
|
||||
static rstl::reserved_vector<CDrawable, 50>* sData;
|
||||
static rstl::reserved_vector<CDrawable, 512>* sData;
|
||||
static rstl::reserved_vector<rstl::reserved_vector<CDrawable*, 128>, 50>* sBuckets;
|
||||
static rstl::reserved_vector<CDrawablePlaneObject, 8>* sPlaneObjectData;
|
||||
static rstl::reserved_vector<u16, 8>* sPlaneObjectBucket;
|
||||
|
@ -42,8 +42,8 @@ class Buckets
|
|||
public:
|
||||
static void Clear();
|
||||
static void Sort();
|
||||
static void InsertPlaneObject(float dist, float something, const zeus::CAABox& aabb, bool b1,
|
||||
const zeus::CPlane& plane, bool b2, EDrawableType dtype, const void* data);
|
||||
static void InsertPlaneObject(float dist, float something, const zeus::CAABox& aabb, bool invertTest,
|
||||
const zeus::CPlane& plane, bool zOnly, EDrawableType dtype, const void* data);
|
||||
static void Insert(const zeus::CVector3f& pos, const zeus::CAABox& aabb, EDrawableType dtype,
|
||||
const void* data, const zeus::CPlane& plane, u16 extraSort);
|
||||
static void Shutdown();
|
||||
|
@ -208,6 +208,7 @@ public:
|
|||
void AddStaticGeometry(const std::vector<CMetroidModelInstance>*, const CAreaRenderOctTree*, int areaIdx);
|
||||
void EnablePVS(const CPVSVisSet&, u32);
|
||||
void DisablePVS();
|
||||
void UpdateAreaUniforms(int areaIdx);
|
||||
void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>*);
|
||||
void DrawAreaGeometry(int areaIdx, int mask, int targetMask);
|
||||
void DrawUnsortedGeometry(int areaIdx, int mask, int targetMask);
|
||||
|
|
|
@ -12,13 +12,14 @@ class CDrawablePlaneObject : public CDrawable
|
|||
u16 x24_targetBucket;
|
||||
float x28_something;
|
||||
zeus::CPlane x2c_plane;
|
||||
bool x3c_24 : 1;
|
||||
bool x3c_25 : 1;
|
||||
bool x3c_24_invertTest : 1;
|
||||
bool x3c_25_zOnly : 1;
|
||||
public:
|
||||
CDrawablePlaneObject(EDrawableType dtype, float dist, float something, const zeus::CAABox& aabb,
|
||||
bool b1, const zeus::CPlane& plane, bool b2, const void* data)
|
||||
bool invertTest, const zeus::CPlane& plane, bool zOnly, const void* data)
|
||||
: CDrawable(dtype, 0, dist, aabb, data), x24_targetBucket(0), x28_something(something),
|
||||
x2c_plane(plane) {x3c_24 = b1; x3c_25 = b2;}
|
||||
x2c_plane(plane) {x3c_24_invertTest = invertTest; x3c_25_zOnly = zOnly;}
|
||||
const zeus::CPlane& GetPlane() const { return x2c_plane; }
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -606,7 +606,9 @@ void CBooModel::DrawSurfaces(const CModelFlags& flags) const
|
|||
|
||||
void CBooModel::DrawSurface(const CBooSurface& surf, const CModelFlags& flags) const
|
||||
{
|
||||
if (m_uniUpdateCount > m_instances.size())
|
||||
//if (m_uniUpdateCount == 0)
|
||||
// Log.report(logvisor::Fatal, "UpdateUniformData() not called");
|
||||
if (m_uniUpdateCount == 0 || m_uniUpdateCount > m_instances.size())
|
||||
return;
|
||||
const ModelInstance& inst = m_instances[m_uniUpdateCount-1];
|
||||
|
||||
|
@ -727,7 +729,8 @@ void CBooModel::UVAnimationBuffer::ProcessAnimation(u8*& bufOut, const UVAnimati
|
|||
}
|
||||
case UVAnimation::Mode::CylinderEnvironment:
|
||||
{
|
||||
texMtxOut = (CGraphics::g_ViewMatrix.inverse() * CGraphics::g_GXModelMatrix).toMatrix4f();
|
||||
//texMtxOut = (CGraphics::g_ViewMatrix.inverse() * CGraphics::g_GXModelMatrix).toMatrix4f();
|
||||
texMtxOut = CGraphics::g_GXModelView.toMatrix4f();
|
||||
texMtxOut.vec[3].zeroOut();
|
||||
|
||||
const zeus::CVector3f& viewOrigin = CGraphics::g_ViewMatrix.origin;
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "CMapSurfaceShader.hpp"
|
||||
#include "TShader.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "CMapSurfaceShader.hpp"
|
||||
#include "TShader.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "CMapSurfaceShader.hpp"
|
||||
#include "TShader.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
|
|
@ -16,7 +16,7 @@ void CRadarPaintShader::draw(const std::vector<Instance>& instances, const CText
|
|||
{
|
||||
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(Instance), m_maxInsts);
|
||||
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(zeus::CMatrix4f), 1);
|
||||
TShader<CRadarPaintShader>::BuildShaderDataBinding(ctx, *this);
|
||||
m_dataBind = TShader<CRadarPaintShader>::BuildShaderDataBinding(ctx, *this);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ public:
|
|||
~CGuiFrame();
|
||||
|
||||
CGuiSys& GetGuiSys() {return x8_guiSys;}
|
||||
CAssetId GetAssetId() const {return x0_id;}
|
||||
|
||||
CGuiLight* GetFrameLight(int idx) const { return m_indexedLights[idx]; }
|
||||
CGuiCamera* GetFrameCamera() const { return x14_camera.get(); }
|
||||
|
|
|
@ -649,7 +649,8 @@ void CInGameGuiManager::Draw(CStateManager& stateMgr)
|
|||
x148_model_automapper->SetIsVisible(true);
|
||||
x148_model_automapper->Draw(CGuiWidgetDrawParms(1.f, zeus::CVector3f::skZero));
|
||||
// ZTest no write
|
||||
x38_autoMapper->Draw(stateMgr, zeus::CTransform::Translate(0.f, 0.02f, 0.f) * x18c_camXf, mapAlpha * x1f4_visorStaticAlpha * t);
|
||||
x38_autoMapper->Draw(stateMgr, zeus::CTransform::Translate(0.f, 0.02f, 0.f) * x18c_camXf,
|
||||
mapAlpha * x1f4_visorStaticAlpha * t);
|
||||
// Zest and write
|
||||
x148_model_automapper->SetIsVisible(false);
|
||||
}
|
||||
|
|
|
@ -102,8 +102,8 @@ CGameArchitectureSupport::CGameArchitectureSupport(CMain& parent,
|
|||
CStreamAudioManager::SetMusicVolume(0x7f);
|
||||
m->ResetGameState();
|
||||
|
||||
std::shared_ptr<CIOWin> splash = std::make_shared<CSplashScreen>(CSplashScreen::ESplashScreen::Nintendo);
|
||||
x58_ioWinManager.AddIOWin(splash, 1000, 10000);
|
||||
//std::shared_ptr<CIOWin> splash = std::make_shared<CSplashScreen>(CSplashScreen::ESplashScreen::Nintendo);
|
||||
//x58_ioWinManager.AddIOWin(splash, 1000, 10000);
|
||||
|
||||
std::shared_ptr<CIOWin> mf = std::make_shared<CMainFlow>();
|
||||
x58_ioWinManager.AddIOWin(mf, 0, 0);
|
||||
|
|
|
@ -67,6 +67,7 @@ CENTITY_TYPES = (
|
|||
('CScriptTimer', 'World/CScriptTimer.hpp'),
|
||||
('CScriptTrigger', 'World/CScriptTrigger.hpp'),
|
||||
('CScriptVisorFlare', 'World/CScriptVisorFlare.hpp'),
|
||||
('CScriptVisorGoo', 'World/CScriptVisorGoo.hpp'),
|
||||
('CScriptWater', 'World/CScriptWater.hpp'),
|
||||
('CScriptWaypoint', 'World/CScriptWaypoint.hpp'),
|
||||
('CSnakeWeedSwarm', 'World/CSnakeWeedSwarm.hpp'),
|
||||
|
|
|
@ -13,7 +13,7 @@ class CWeaponMode
|
|||
bool x4_26_instantKill : 1;
|
||||
|
||||
public:
|
||||
CWeaponMode() = default;
|
||||
CWeaponMode() { x4_24_charged = false; x4_25_comboed = false; x4_26_instantKill = false; }
|
||||
CWeaponMode(EWeaponType, bool charged = false, bool comboed = false, bool instaKill = false);
|
||||
EWeaponType GetType() const;
|
||||
|
||||
|
|
|
@ -16,10 +16,10 @@ class CDamageVulnerability;
|
|||
class CDamageInfo
|
||||
{
|
||||
CWeaponMode x0_weaponMode;
|
||||
float x8_damage;
|
||||
float xc_radiusDamage;
|
||||
float x10_radius;
|
||||
float x14_knockback;
|
||||
float x8_damage = 0.f;
|
||||
float xc_radiusDamage = 0.f;
|
||||
float x10_radius = 0.f;
|
||||
float x14_knockback = 0.f;
|
||||
bool x18_noImmunity = false;
|
||||
|
||||
public:
|
||||
|
|
|
@ -1010,7 +1010,7 @@ void CGameArea::Validate(CStateManager& mgr)
|
|||
|
||||
PostConstructArea();
|
||||
if (x4_selfIdx != kInvalidAreaId)
|
||||
mgr.WorldNC()->MoveAreaToChain3(x4_selfIdx);
|
||||
mgr.WorldNC()->MoveAreaToAliveChain(x4_selfIdx);
|
||||
|
||||
LoadScriptObjects(mgr);
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ class CGameArea : public IGameArea
|
|||
bool xf0_27_paused : 1;
|
||||
bool xf0_28_validated : 1;
|
||||
};
|
||||
u8 _dummy = 0;
|
||||
u32 _dummy = 0;
|
||||
};
|
||||
|
||||
enum class EPhase
|
||||
|
|
|
@ -96,6 +96,7 @@ set(WORLD_SOURCES
|
|||
CScriptRoomAcoustics.hpp CScriptRoomAcoustics.cpp
|
||||
CScriptControllerAction.hpp CScriptControllerAction.cpp
|
||||
CVisorFlare.hpp CVisorFlare.cpp
|
||||
CScriptVisorGoo.hpp CScriptVisorGoo.cpp
|
||||
CGrappleParameters.hpp
|
||||
CActorParameters.hpp
|
||||
CLightParameters.hpp
|
||||
|
|
|
@ -99,7 +99,7 @@ void CPhysicsActor::AddMotionState(const CMotionState& mst)
|
|||
{
|
||||
zeus::CNUQuaternion q{x34_transform.buildMatrix3f()};
|
||||
q += mst.xc_orientation;
|
||||
SetTransform(zeus::CTransform(q, x34_transform.origin));
|
||||
SetTransform(zeus::CTransform(zeus::CQuaternion::fromNUQuaternion(q), x34_transform.origin));
|
||||
|
||||
SetTranslation(x34_transform.origin + mst.x0_translation);
|
||||
|
||||
|
@ -115,7 +115,7 @@ CMotionState CPhysicsActor::GetMotionState() const
|
|||
|
||||
void CPhysicsActor::SetMotionState(const CMotionState& mst)
|
||||
{
|
||||
SetTransform(zeus::CTransform(mst.xc_orientation, x34_transform.origin));
|
||||
SetTransform(zeus::CTransform(zeus::CQuaternion::fromNUQuaternion(mst.xc_orientation), x34_transform.origin));
|
||||
SetTranslation(mst.x0_translation);
|
||||
|
||||
xfc_constantForce = mst.x1c_velocity;
|
||||
|
@ -302,16 +302,17 @@ CMotionState CPhysicsActor::PredictMotion(float dt) const
|
|||
CMotionState CPhysicsActor::PredictLinearMotion(float dt) const
|
||||
{
|
||||
zeus::CVector3f velocity = CalculateNewVelocityWR_UsingImpulses();
|
||||
return {velocity * dt, zeus::CNUQuaternion::skNoRotation, ((x15c_force + x150_momentum) * dt) + x168_impulse,
|
||||
return {velocity * dt, {0.f, zeus::CVector3f::skZero}, ((x15c_force + x150_momentum) * dt) + x168_impulse,
|
||||
zeus::CAxisAngle::skZero};
|
||||
}
|
||||
|
||||
CMotionState CPhysicsActor::PredictAngularMotion(float dt) const
|
||||
{
|
||||
const zeus::CVector3f v1 = xf4_inertiaTensorRecip * (x180_angularImpulse + x198_moveAngularImpulse);
|
||||
zeus::CNUQuaternion q = 0.5f * zeus::CNUQuaternion({0.f, x144_angularVelocity + v1});
|
||||
return {zeus::CVector3f::skZero, q * zeus::CNUQuaternion(x34_transform.buildMatrix3f()) * dt,
|
||||
zeus::CNUQuaternion q = 0.5f * zeus::CNUQuaternion(0.f, x144_angularVelocity + v1);
|
||||
CMotionState ret = {zeus::CVector3f::skZero, q * zeus::CNUQuaternion(x34_transform.buildMatrix3f()) * dt,
|
||||
zeus::CVector3f::skZero, (x174_torque * dt) + x180_angularImpulse};
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CPhysicsActor::ApplyForceOR(const zeus::CVector3f& force, const zeus::CAxisAngle& torque)
|
||||
|
|
|
@ -39,7 +39,7 @@ void CScriptAreaAttributes::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId
|
|||
area->SetAreaAttributes(this);
|
||||
stateMgr.GetEnvFxManager()->SetFxDensity(500, x3c_envFxDensity);
|
||||
}
|
||||
else if (msg >= EScriptObjectMessage::Deleted)
|
||||
else if (msg == EScriptObjectMessage::Deleted)
|
||||
{
|
||||
CGameArea* area = stateMgr.WorldNC()->GetArea(x4_areaId);
|
||||
|
||||
|
|
|
@ -33,7 +33,8 @@ class CScriptDock : public CPhysicsActor
|
|||
|
||||
public:
|
||||
CScriptDock(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CVector3f position,
|
||||
const zeus::CVector3f& extent, s32, TAreaId, bool active, s32 w1, bool b1);
|
||||
const zeus::CVector3f& extent, s32 dock, TAreaId area, bool active,
|
||||
s32 dockReferenceCount, bool loadConnected);
|
||||
|
||||
void Accept(IVisitor& visitor);
|
||||
void Think(float, CStateManager&);
|
||||
|
|
|
@ -6,21 +6,21 @@
|
|||
namespace urde
|
||||
{
|
||||
|
||||
SSpindleSegment::SSpindleSegment(CInputStream& in)
|
||||
SSpindleProperty::SSpindleProperty(CInputStream& in)
|
||||
: x0_(in.readUint32Big()), x4_paramFlags(ScriptLoader::LoadParameterFlags(in)),
|
||||
x8_(in.readFloatBig()), xc_(in.readFloatBig()), x10_(in.readFloatBig()), x14_(in.readFloatBig())
|
||||
{}
|
||||
|
||||
CScriptSpindleCamera::CScriptSpindleCamera(TUniqueId uid, const std::string& name, const CEntityInfo& info,
|
||||
const zeus::CTransform& xf, bool active, u32 r9,
|
||||
float f1, float f2, float f3, float f4, const SSpindleSegment& seg1,
|
||||
const SSpindleSegment& seg2, const SSpindleSegment& seg3,
|
||||
const SSpindleSegment& seg4, const SSpindleSegment& seg5,
|
||||
const SSpindleSegment& seg6, const SSpindleSegment& seg7,
|
||||
const SSpindleSegment& seg8, const SSpindleSegment& seg9,
|
||||
const SSpindleSegment& seg10, const SSpindleSegment& seg11,
|
||||
const SSpindleSegment& seg12, const SSpindleSegment& seg13,
|
||||
const SSpindleSegment& seg14, const SSpindleSegment& seg15)
|
||||
float f1, float f2, float f3, float f4, const SSpindleProperty& seg1,
|
||||
const SSpindleProperty& seg2, const SSpindleProperty& seg3,
|
||||
const SSpindleProperty& seg4, const SSpindleProperty& seg5,
|
||||
const SSpindleProperty& seg6, const SSpindleProperty& seg7,
|
||||
const SSpindleProperty& seg8, const SSpindleProperty& seg9,
|
||||
const SSpindleProperty& seg10, const SSpindleProperty& seg11,
|
||||
const SSpindleProperty& seg12, const SSpindleProperty& seg13,
|
||||
const SSpindleProperty& seg14, const SSpindleProperty& seg15)
|
||||
: CGameCamera(uid, active, name, info, xf, CCameraManager::ThirdPersonFOV(), CCameraManager::NearPlane(),
|
||||
CCameraManager::FarPlane(), CCameraManager::Aspect(), kInvalidUniqueId, false, 0),
|
||||
x188_r9(r9), x1b0_f1(f1), x1b4_f2(f2), x1b8_f3(f2), x1bc_f4(f4), x1c0_seg1(seg1), x1d8_seg2(seg2),
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
namespace urde
|
||||
{
|
||||
|
||||
struct SSpindleSegment
|
||||
struct SSpindleProperty
|
||||
{
|
||||
u32 x0_;
|
||||
u32 x4_paramFlags;
|
||||
|
@ -15,7 +15,7 @@ struct SSpindleSegment
|
|||
float x10_;
|
||||
float x14_;
|
||||
|
||||
SSpindleSegment(CInputStream& in);
|
||||
SSpindleProperty(CInputStream& in);
|
||||
void FixupAngles()
|
||||
{
|
||||
x8_ = zeus::degToRad(x8_);
|
||||
|
@ -31,35 +31,35 @@ class CScriptSpindleCamera : public CGameCamera
|
|||
float x1b4_f2;
|
||||
float x1b8_f3;
|
||||
float x1bc_f4;
|
||||
SSpindleSegment x1c0_seg1;
|
||||
SSpindleSegment x1d8_seg2;
|
||||
SSpindleSegment x1f0_seg3;
|
||||
SSpindleSegment x208_seg4;
|
||||
SSpindleSegment x220_seg5;
|
||||
SSpindleSegment x238_seg6;
|
||||
SSpindleSegment x250_seg7;
|
||||
SSpindleSegment x268_seg8;
|
||||
SSpindleSegment x280_seg9;
|
||||
SSpindleSegment x298_seg10;
|
||||
SSpindleSegment x2b0_seg11;
|
||||
SSpindleSegment x2c8_seg12;
|
||||
SSpindleSegment x2e0_seg13;
|
||||
SSpindleSegment x2f8_seg14;
|
||||
SSpindleSegment x310_seg15;
|
||||
SSpindleProperty x1c0_seg1;
|
||||
SSpindleProperty x1d8_seg2;
|
||||
SSpindleProperty x1f0_seg3;
|
||||
SSpindleProperty x208_seg4;
|
||||
SSpindleProperty x220_seg5;
|
||||
SSpindleProperty x238_seg6;
|
||||
SSpindleProperty x250_seg7;
|
||||
SSpindleProperty x268_seg8;
|
||||
SSpindleProperty x280_seg9;
|
||||
SSpindleProperty x298_seg10;
|
||||
SSpindleProperty x2b0_seg11;
|
||||
SSpindleProperty x2c8_seg12;
|
||||
SSpindleProperty x2e0_seg13;
|
||||
SSpindleProperty x2f8_seg14;
|
||||
SSpindleProperty x310_seg15;
|
||||
float x328_ = 0.f;
|
||||
bool x32c_24 = false;
|
||||
zeus::CVector3f x330_lookDir;
|
||||
public:
|
||||
CScriptSpindleCamera(TUniqueId uid, const std::string& name, const CEntityInfo& info,
|
||||
const zeus::CTransform& xf, bool active, u32 r9,
|
||||
float f1, float f2, float f3, float f4, const SSpindleSegment& seg1,
|
||||
const SSpindleSegment& seg2, const SSpindleSegment& seg3,
|
||||
const SSpindleSegment& seg4, const SSpindleSegment& seg5,
|
||||
const SSpindleSegment& seg6, const SSpindleSegment& seg7,
|
||||
const SSpindleSegment& seg8, const SSpindleSegment& seg9,
|
||||
const SSpindleSegment& seg10, const SSpindleSegment& seg11,
|
||||
const SSpindleSegment& seg12, const SSpindleSegment& seg13,
|
||||
const SSpindleSegment& seg14, const SSpindleSegment& seg15);
|
||||
float f1, float f2, float f3, float f4, const SSpindleProperty& seg1,
|
||||
const SSpindleProperty& seg2, const SSpindleProperty& seg3,
|
||||
const SSpindleProperty& seg4, const SSpindleProperty& seg5,
|
||||
const SSpindleProperty& seg6, const SSpindleProperty& seg7,
|
||||
const SSpindleProperty& seg8, const SSpindleProperty& seg9,
|
||||
const SSpindleProperty& seg10, const SSpindleProperty& seg11,
|
||||
const SSpindleProperty& seg12, const SSpindleProperty& seg13,
|
||||
const SSpindleProperty& seg14, const SSpindleProperty& seg15);
|
||||
|
||||
void Accept(IVisitor& visitor);
|
||||
void ProcessInput(const CFinalInput& input, CStateManager& mgr);
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
#include "CScriptVisorGoo.hpp"
|
||||
#include "CActorParameters.hpp"
|
||||
#include "GameGlobalObjects.hpp"
|
||||
#include "CSimplePool.hpp"
|
||||
#include "TCastTo.hpp"
|
||||
#include "CStateManager.hpp"
|
||||
#include "CPlayer.hpp"
|
||||
#include "CHUDBillboardEffect.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
CScriptVisorGoo::CScriptVisorGoo(TUniqueId uid, const std::string& name, const CEntityInfo& info,
|
||||
const zeus::CTransform& xf, CAssetId particle, CAssetId electric,
|
||||
float minDist, float maxDist, float nearProb, float farProb,
|
||||
const zeus::CColor& color, int sfx, bool forceShow, bool active)
|
||||
: CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), {}, CActorParameters::None(), kInvalidUniqueId),
|
||||
xe8_particleDesc(CToken(TObjOwnerDerivedFromIObj<CGenDescription>::GetNewDerivedObject({}))),
|
||||
xf0_electricDesc(CToken(TObjOwnerDerivedFromIObj<CElectricDescription>::GetNewDerivedObject({}))),
|
||||
xf8_sfx(CSfxManager::TranslateSFXID(sfx)), xfc_particleId(particle), x100_electricId(electric),
|
||||
x104_minDist(minDist), x108_maxDist(std::max(maxDist, minDist + 0.01f)), x10c_nearProb(nearProb),
|
||||
x110_farProb(farProb), x114_color(color)
|
||||
{
|
||||
x118_24_angleTest = !forceShow;
|
||||
if (particle.IsValid())
|
||||
xe8_particleDesc = g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), particle});
|
||||
if (electric.IsValid())
|
||||
xf0_electricDesc = g_SimplePool->GetObj(SObjectTag{FOURCC('ELSC'), electric});
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::Accept(IVisitor& visitor)
|
||||
{
|
||||
visitor.Visit(this);
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::Think(float, CStateManager& mgr)
|
||||
{
|
||||
if (GetActive())
|
||||
{
|
||||
bool loaded = false;
|
||||
if (xfc_particleId.IsValid())
|
||||
{
|
||||
if (xe8_particleDesc.IsLoaded())
|
||||
{
|
||||
if (x100_electricId.IsValid())
|
||||
loaded = xf0_electricDesc.IsLoaded();
|
||||
else
|
||||
loaded = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
loaded = xf0_electricDesc.IsLoaded();
|
||||
}
|
||||
|
||||
if (loaded)
|
||||
{
|
||||
bool showGoo = false;
|
||||
if (mgr.GetPlayer().GetCameraState() == CPlayer::EPlayerCameraState::FirstPerson)
|
||||
{
|
||||
zeus::CVector3f eyeToGoo = GetTranslation() - mgr.GetPlayer().GetEyePosition();
|
||||
float eyeToGooDist = eyeToGoo.magnitude();
|
||||
if (eyeToGooDist >= x104_minDist && eyeToGooDist <= x108_maxDist)
|
||||
{
|
||||
if (x118_24_angleTest)
|
||||
{
|
||||
float angle = zeus::radToDeg(
|
||||
std::acos(mgr.GetCameraManager()->GetCurrentCameraTransform(mgr).basis[1].
|
||||
normalized().dot(eyeToGoo.normalized())));
|
||||
float angleThresh = 45.f;
|
||||
if (eyeToGooDist < 4.f)
|
||||
{
|
||||
angleThresh *= 4.f / eyeToGooDist;
|
||||
angleThresh = std::min(90.f, angleThresh);
|
||||
}
|
||||
if (angle <= angleThresh)
|
||||
showGoo = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
showGoo = true;
|
||||
}
|
||||
if (showGoo)
|
||||
{
|
||||
float t = (x108_maxDist - eyeToGooDist) / (x108_maxDist - x104_minDist);
|
||||
if (mgr.GetActiveRandom()->Float() * 100.f <= (1.f - t) * x110_farProb + t * x10c_nearProb)
|
||||
{
|
||||
mgr.AddObject(new CHUDBillboardEffect(
|
||||
xfc_particleId.IsValid() ? xe8_particleDesc :
|
||||
std::experimental::optional<TToken<CGenDescription>>(),
|
||||
x100_electricId.IsValid() ? xf0_electricDesc :
|
||||
std::experimental::optional<TToken<CElectricDescription>>(),
|
||||
mgr.AllocateUniqueId(), true, "VisorGoo",
|
||||
CHUDBillboardEffect::GetNearClipDistance(mgr),
|
||||
CHUDBillboardEffect::GetScaleForPOV(mgr),
|
||||
x114_color, zeus::CVector3f::skOne, zeus::CVector3f::skZero));
|
||||
CSfxManager::SfxStart(xf8_sfx, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mgr.FreeScriptObject(GetUniqueId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case EScriptObjectMessage::Activate:
|
||||
if (xfc_particleId.IsValid())
|
||||
xe8_particleDesc.Lock();
|
||||
if (x100_electricId.IsValid())
|
||||
xf0_electricDesc.Lock();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
CActor::AcceptScriptMsg(msg, objId, mgr);
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const
|
||||
{
|
||||
// Empty
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::Render(const CStateManager& mgr) const
|
||||
{
|
||||
// Empty
|
||||
}
|
||||
|
||||
rstl::optional_object<zeus::CAABox> CScriptVisorGoo::GetTouchBounds() const
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
void CScriptVisorGoo::Touch(CActor& other, CStateManager& mgr)
|
||||
{
|
||||
// Empty
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef URDE_CSCRIPTVISORGOO_HPP
|
||||
#define URDE_CSCRIPTVISORGOO_HPP
|
||||
|
||||
#include "CActor.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
class CScriptVisorGoo : public CActor
|
||||
{
|
||||
TToken<CGenDescription> xe8_particleDesc;
|
||||
TToken<CElectricDescription> xf0_electricDesc;
|
||||
u16 xf8_sfx;
|
||||
CAssetId xfc_particleId;
|
||||
CAssetId x100_electricId;
|
||||
float x104_minDist;
|
||||
float x108_maxDist;
|
||||
float x10c_nearProb;
|
||||
float x110_farProb;
|
||||
zeus::CColor x114_color;
|
||||
bool x118_24_angleTest : 1;
|
||||
public:
|
||||
CScriptVisorGoo(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf,
|
||||
CAssetId particle, CAssetId electric, float minDist, float maxDist, float nearProb, float farProb,
|
||||
const zeus::CColor& color, int sfx, bool forceShow, bool active);
|
||||
|
||||
void Accept(IVisitor& visitor);
|
||||
void Think(float, CStateManager& stateMgr);
|
||||
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);
|
||||
void AddToRenderer(const zeus::CFrustum&, const CStateManager&) const;
|
||||
void Render(const CStateManager&) const;
|
||||
rstl::optional_object<zeus::CAABox> GetTouchBounds() const;
|
||||
void Touch(CActor&, CStateManager&);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // URDE_CSCRIPTVISORGOO_HPP
|
|
@ -230,14 +230,14 @@ void CWorld::MoveToChain(CGameArea* area, EChain chain)
|
|||
return;
|
||||
|
||||
if (area->x138_curChain != EChain::Invalid)
|
||||
if (x4c_chainHeads[int(chain)] == area)
|
||||
x4c_chainHeads[int(chain)] = area->x130_next;
|
||||
if (x4c_chainHeads[int(area->x138_curChain)] == area)
|
||||
x4c_chainHeads[int(area->x138_curChain)] = area->x130_next;
|
||||
|
||||
area->SetChain(x4c_chainHeads[int(chain)], chain);
|
||||
x4c_chainHeads[int(chain)] = area;
|
||||
}
|
||||
|
||||
void CWorld::MoveAreaToChain3(TAreaId aid)
|
||||
void CWorld::MoveAreaToAliveChain(TAreaId aid)
|
||||
{
|
||||
MoveToChain(x18_areas[aid].get(), EChain::Alive);
|
||||
}
|
||||
|
@ -282,7 +282,7 @@ bool CWorld::CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId)
|
|||
{
|
||||
CAssetId skyboxId = r.readUint32Big();
|
||||
if (skyboxId != -1 && mgr)
|
||||
x94_skybox = g_SimplePool->GetObj(SObjectTag{FOURCC('CMDL'), skyboxId});
|
||||
x94_skyboxWorld = g_SimplePool->GetObj(SObjectTag{FOURCC('CMDL'), skyboxId});
|
||||
}
|
||||
if (version >= 17)
|
||||
x2c_relays = CWorld::CRelay::ReadMemoryRelays(r);
|
||||
|
@ -359,13 +359,13 @@ bool CWorld::CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId)
|
|||
}
|
||||
case Phase::LoadingSkyBox:
|
||||
{
|
||||
x70_26_skyboxOverridden = true;
|
||||
x70_27_needsSky = false;
|
||||
x70_26_skyboxActive = true;
|
||||
x70_27_skyboxVisible = false;
|
||||
|
||||
if (!x94_skybox.IsLoaded())
|
||||
if (!x94_skyboxWorld.IsLoaded())
|
||||
return false;
|
||||
|
||||
CModel* skybox = x94_skybox.GetObj();
|
||||
CModel* skybox = x94_skyboxWorld.GetObj();
|
||||
if (!skybox)
|
||||
return false;
|
||||
|
||||
|
@ -373,7 +373,7 @@ bool CWorld::CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId)
|
|||
if (!skybox->IsLoaded(0))
|
||||
return false;
|
||||
|
||||
xa4_skyboxB = x94_skybox;
|
||||
xa4_skyboxWorldLoaded = x94_skyboxWorld;
|
||||
|
||||
for (CSoundGroupData& group : x74_soundGroupData)
|
||||
group.x1c_groupData.Lock();
|
||||
|
@ -565,15 +565,15 @@ void CWorld::PropogateAreaChain(CGameArea::EOcclusionState occlusionState, CGame
|
|||
void CWorld::Update(float dt)
|
||||
{
|
||||
xc4_neededFx = EEnvFxType::None;
|
||||
CAssetId skyModel;
|
||||
CAssetId overrideSkyId;
|
||||
bool needsSky = false;
|
||||
CGameArea::EOcclusionState occlusionState = CGameArea::EOcclusionState::Occluded;
|
||||
bool skyVisible = false;
|
||||
|
||||
u32 r26 = 0;
|
||||
u32 areaCount = 0;
|
||||
|
||||
for (CGameArea* head = x4c_chainHeads[3] ;
|
||||
head != skGlobalNonConstEnd ;
|
||||
head = head->x130_next, ++r26)
|
||||
head = head->x130_next, ++areaCount)
|
||||
{
|
||||
head->AliveUpdate(dt);
|
||||
|
||||
|
@ -582,12 +582,14 @@ void CWorld::Update(float dt)
|
|||
const CScriptAreaAttributes* attrs = head->GetPostConstructed()->x10d8_areaAttributes;
|
||||
|
||||
if (attrs && attrs->GetSkyModel().IsValid())
|
||||
skyModel = attrs->GetSkyModel();
|
||||
overrideSkyId = attrs->GetSkyModel();
|
||||
|
||||
needsSky = true;
|
||||
occlusionState = (head->IsPostConstructed()
|
||||
CGameArea::EOcclusionState occlusionState = (head->IsPostConstructed()
|
||||
? head->GetPostConstructed()->x10dc_occlusionState
|
||||
: CGameArea::EOcclusionState::Occluded);
|
||||
if (occlusionState == CGameArea::EOcclusionState::Visible)
|
||||
skyVisible = true;
|
||||
}
|
||||
|
||||
EEnvFxType envFxType = head->DoesAreaNeedEnvFx();
|
||||
|
@ -595,16 +597,48 @@ void CWorld::Update(float dt)
|
|||
xc4_neededFx = envFxType;
|
||||
}
|
||||
|
||||
if (r26 == 0)
|
||||
if (areaCount == 0)
|
||||
return;
|
||||
|
||||
if (skyModel.IsValid() && needsSky)
|
||||
if (overrideSkyId.IsValid() && needsSky)
|
||||
{
|
||||
x70_26_skyboxOverridden = true;
|
||||
x70_27_needsSky = needsSky;
|
||||
|
||||
TToken<CModel> skybox = g_SimplePool->GetObj({SBIG('CMDL'), skyModel});
|
||||
/* TODO: Finish */
|
||||
x70_26_skyboxActive = true;
|
||||
x70_27_skyboxVisible = skyVisible;
|
||||
xb4_skyboxOverride = g_SimplePool->GetObj({SBIG('CMDL'), overrideSkyId});
|
||||
xa4_skyboxWorldLoaded = TLockedToken<CModel>();
|
||||
if (x94_skyboxWorld)
|
||||
x94_skyboxWorld.Unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
xb4_skyboxOverride = TLockedToken<CModel>();
|
||||
if (!x94_skyboxWorld)
|
||||
{
|
||||
x70_26_skyboxActive = false;
|
||||
x70_27_skyboxVisible = false;
|
||||
}
|
||||
else if (!needsSky)
|
||||
{
|
||||
xa4_skyboxWorldLoaded = TLockedToken<CModel>();
|
||||
x94_skyboxWorld.Unlock();
|
||||
x70_26_skyboxActive = false;
|
||||
x70_27_skyboxVisible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!xa4_skyboxWorldLoaded)
|
||||
{
|
||||
x94_skyboxWorld.Lock();
|
||||
if (x94_skyboxWorld.IsLoaded())
|
||||
{
|
||||
x94_skyboxWorld->Touch(0);
|
||||
if (x94_skyboxWorld->IsLoaded(0))
|
||||
xa4_skyboxWorldLoaded = x94_skyboxWorld;
|
||||
}
|
||||
}
|
||||
x70_26_skyboxActive = true;
|
||||
x70_27_skyboxVisible = skyVisible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -631,14 +665,14 @@ void CWorld::TouchSky()
|
|||
void CWorld::DrawSky(const zeus::CTransform& xf) const
|
||||
{
|
||||
const CModel* model;
|
||||
if (xa4_skyboxB)
|
||||
model = xa4_skyboxB.GetObj();
|
||||
else if (xb4_skyboxC)
|
||||
model = xb4_skyboxC.GetObj();
|
||||
if (xa4_skyboxWorldLoaded)
|
||||
model = xa4_skyboxWorldLoaded.GetObj();
|
||||
else if (xb4_skyboxOverride)
|
||||
model = xb4_skyboxOverride.GetObj();
|
||||
else
|
||||
return;
|
||||
|
||||
if (!x70_27_needsSky)
|
||||
if (!x70_27_skyboxVisible)
|
||||
return;
|
||||
|
||||
CGraphics::DisableAllLights();
|
||||
|
|
|
@ -137,16 +137,16 @@ private:
|
|||
{
|
||||
bool x70_24_currentAreaNeedsAllocation : 1;
|
||||
bool x70_25_paused : 1;
|
||||
bool x70_26_skyboxOverridden : 1;
|
||||
bool x70_27_needsSky : 1;
|
||||
bool x70_26_skyboxActive : 1;
|
||||
bool x70_27_skyboxVisible : 1;
|
||||
};
|
||||
u16 dummy = 0;
|
||||
u32 dummy = 0;
|
||||
};
|
||||
std::vector<CSoundGroupData> x74_soundGroupData;
|
||||
std::string x84_defAudioTrack;
|
||||
TLockedToken<CModel> x94_skybox;
|
||||
TLockedToken<CModel> xa4_skyboxB;
|
||||
TLockedToken<CModel> xb4_skyboxC;
|
||||
TLockedToken<CModel> x94_skyboxWorld;
|
||||
TLockedToken<CModel> xa4_skyboxWorldLoaded;
|
||||
TLockedToken<CModel> xb4_skyboxOverride;
|
||||
EEnvFxType xc4_neededFx = EEnvFxType::None;
|
||||
std::vector<CSfxHandle> xc8_sfxHandles;
|
||||
|
||||
|
@ -156,7 +156,7 @@ private:
|
|||
public:
|
||||
|
||||
void MoveToChain(CGameArea* area, EChain chain);
|
||||
void MoveAreaToChain3(TAreaId aid);
|
||||
void MoveAreaToAliveChain(TAreaId aid);
|
||||
bool CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId);
|
||||
CGameArea::CChainIterator GetChainHead(EChain chain) { return {x4c_chainHeads[int(chain)]}; }
|
||||
CGameArea::CConstChainIterator GetChainHead(EChain chain) const { return {x4c_chainHeads[int(chain)]}; }
|
||||
|
|
|
@ -155,7 +155,7 @@ void CWorldTransManager::UpdateText(float dt)
|
|||
if (printed >= nextSfxInterval)
|
||||
{
|
||||
x3c_sfxInterval = nextSfxInterval;
|
||||
CSfxManager::SfxStart(1438, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
|
||||
//CSfxManager::SfxStart(1438, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include "CScriptSwitch.hpp"
|
||||
#include "CScriptTimer.hpp"
|
||||
#include "CScriptVisorFlare.hpp"
|
||||
#include "CScriptVisorGoo.hpp"
|
||||
#include "CScriptWater.hpp"
|
||||
#include "CScriptWaypoint.hpp"
|
||||
#include "CScriptWorldTeleporter.hpp"
|
||||
|
@ -723,8 +724,8 @@ CEntity* ScriptLoader::LoadDock(CStateManager& mgr, CInputStream& in, int propCo
|
|||
scale.readBig(in);
|
||||
u32 dock = in.readUint32Big();
|
||||
TAreaId area = in.readUint32Big();
|
||||
bool b1 = in.readBool();
|
||||
return new CScriptDock(mgr.AllocateUniqueId(), name, info, position, scale, dock, area, active, 0, b1);
|
||||
bool loadConnected = in.readBool();
|
||||
return new CScriptDock(mgr.AllocateUniqueId(), name, info, position, scale, dock, area, active, 0, loadConnected);
|
||||
}
|
||||
|
||||
CEntity* ScriptLoader::LoadCamera(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
|
||||
|
@ -1905,6 +1906,28 @@ CEntity* ScriptLoader::LoadWorldTeleporter(CStateManager& mgr, CInputStream& in,
|
|||
|
||||
CEntity* ScriptLoader::LoadVisorGoo(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
|
||||
{
|
||||
if (!EnsurePropertyCount(propCount, 11, "VisorGoo"))
|
||||
return nullptr;
|
||||
|
||||
std::string name = mgr.HashInstanceName(in);
|
||||
zeus::CVector3f position;
|
||||
position.readBig(in);
|
||||
zeus::CTransform xf = zeus::CTransform::Translate(position);
|
||||
CAssetId particle(in);
|
||||
CAssetId electric(in);
|
||||
float minDist = in.readFloatBig();
|
||||
float maxDist = in.readFloatBig();
|
||||
float nearProb = in.readFloatBig();
|
||||
float farProb = in.readFloatBig();
|
||||
zeus::CColor color;
|
||||
color.readRGBABig(in);
|
||||
u32 sfx = in.readUint32Big();
|
||||
bool forceShow = in.readBool();
|
||||
|
||||
if (particle.IsValid() || electric.IsValid())
|
||||
return new CScriptVisorGoo(mgr.AllocateUniqueId(), name, info, xf, particle, electric,
|
||||
minDist, maxDist, nearProb, farProb, color, sfx, forceShow, false);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -2325,29 +2348,29 @@ CEntity* ScriptLoader::LoadSpindleCamera(CStateManager& mgr, CInputStream& in, i
|
|||
float f3 = in.readFloatBig();
|
||||
float f4 = in.readFloatBig();
|
||||
|
||||
SSpindleSegment seg1(in);
|
||||
SSpindleProperty seg1(in);
|
||||
seg1.FixupAngles();
|
||||
SSpindleSegment seg2(in);
|
||||
SSpindleSegment seg3(in);
|
||||
SSpindleSegment seg4(in);
|
||||
SSpindleSegment seg5(in);
|
||||
SSpindleProperty seg2(in);
|
||||
SSpindleProperty seg3(in);
|
||||
SSpindleProperty seg4(in);
|
||||
SSpindleProperty seg5(in);
|
||||
seg5.FixupAngles();
|
||||
SSpindleSegment seg6(in);
|
||||
SSpindleProperty seg6(in);
|
||||
seg6.FixupAngles();
|
||||
SSpindleSegment seg7(in);
|
||||
SSpindleProperty seg7(in);
|
||||
seg7.FixupAngles();
|
||||
SSpindleSegment seg8(in);
|
||||
SSpindleProperty seg8(in);
|
||||
seg8.FixupAngles();
|
||||
SSpindleSegment seg9(in);
|
||||
SSpindleSegment seg10(in);
|
||||
SSpindleSegment seg11(in);
|
||||
SSpindleProperty seg9(in);
|
||||
SSpindleProperty seg10(in);
|
||||
SSpindleProperty seg11(in);
|
||||
seg11.FixupAngles();
|
||||
SSpindleSegment seg12(in);
|
||||
SSpindleProperty seg12(in);
|
||||
seg12.FixupAngles();
|
||||
SSpindleSegment seg13(in);
|
||||
SSpindleProperty seg13(in);
|
||||
seg13.FixupAngles();
|
||||
SSpindleSegment seg14(in);
|
||||
SSpindleSegment seg15(in);
|
||||
SSpindleProperty seg14(in);
|
||||
SSpindleProperty seg15(in);
|
||||
seg15.FixupAngles();
|
||||
|
||||
return new CScriptSpindleCamera(mgr.AllocateUniqueId(), aHead.x0_name, info, aHead.x10_transform,
|
||||
|
@ -2384,7 +2407,22 @@ CEntity* ScriptLoader::LoadCameraHintTrigger(CStateManager& mgr, CInputStream& i
|
|||
|
||||
CEntity* ScriptLoader::LoadRumbleEffect(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
|
||||
{
|
||||
if (!EnsurePropertyCount(propCount, 6, "RumbleEffect"))
|
||||
return nullptr;
|
||||
|
||||
std::string name = mgr.HashInstanceName(in);
|
||||
zeus::CVector3f position;
|
||||
position.readBig(in);
|
||||
bool active = in.readBool();
|
||||
float f1 = in.readFloatBig();
|
||||
u32 w1 = in.readUint32Big();
|
||||
u32 pFlags = LoadParameterFlags(in);
|
||||
|
||||
return new CScriptSpecialFunction(mgr.AllocateUniqueId(), name, info,
|
||||
ConvertEditorEulerToTransform4f(zeus::CVector3f::skZero, position),
|
||||
CScriptSpecialFunction::ESpecialFunction::RumbleEffect, "",
|
||||
f1, w1, pFlags, 0.f, zeus::CVector3f::skZero,
|
||||
zeus::CColor::skBlack, active, {}, {}, {}, {}, -1, -1, -1);
|
||||
}
|
||||
|
||||
CEntity* ScriptLoader::LoadAmbientAI(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
|
||||
|
|
|
@ -153,6 +153,7 @@ public:
|
|||
|
||||
size_t size() const noexcept { return x0_size; }
|
||||
bool empty() const noexcept { return x0_size == 0; }
|
||||
constexpr size_t capacity() const noexcept { return N; }
|
||||
const T* data() const noexcept { return std::addressof(_value(0)); }
|
||||
T* data() noexcept { return std::addressof(_value(0)); }
|
||||
|
||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
|||
Subproject commit 2410f75845672ebcbf882e6d94d3b6edf1bea194
|
||||
Subproject commit 3a5ddb35c6d028a25e9e3eb0e62be5dee04c9373
|
2
specter
2
specter
|
@ -1 +1 @@
|
|||
Subproject commit 1e6f4fee3dd4dff4a94d325d28232f246d73ce82
|
||||
Subproject commit 9d1d1aba3962526ea2875d9fd5341079bc932163
|
Loading…
Reference in New Issue