mirror of https://github.com/AxioDL/metaforce.git
Various bug fixes
This commit is contained in:
parent
395e5c191b
commit
8fb77eac2c
|
@ -131,7 +131,7 @@ void AROTBuilder::Node::addChild(int level, int minChildren, const std::vector<z
|
|||
compareSets(4, 5) ||
|
||||
compareSets(2, 3) ||
|
||||
compareSets(6, 7))
|
||||
compSubdivs |= 0x4;
|
||||
compSubdivs |= 0x1;
|
||||
if (compareSets(0, 2) ||
|
||||
compareSets(1, 3) ||
|
||||
compareSets(4, 6) ||
|
||||
|
@ -141,7 +141,7 @@ void AROTBuilder::Node::addChild(int level, int minChildren, const std::vector<z
|
|||
compareSets(1, 5) ||
|
||||
compareSets(2, 6) ||
|
||||
compareSets(3, 7))
|
||||
compSubdivs |= 0x1;
|
||||
compSubdivs |= 0x4;
|
||||
|
||||
if (!compSubdivs)
|
||||
{
|
||||
|
@ -175,11 +175,11 @@ void AROTBuilder::Node::nodeCount(size_t& sz, size_t& idxRefs, BitmapPool& bmpPo
|
|||
curOff += nodeSz;
|
||||
if (childNodes.size())
|
||||
{
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x4) != 0) ; ++k)
|
||||
{
|
||||
for (int j=0 ; j < 1 + ((compSubdivs & 0x2) != 0) ; ++j)
|
||||
{
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x1) != 0) ; ++i)
|
||||
{
|
||||
int idx = k*4 + j*2 + i;
|
||||
childNodes[idx].nodeCount(sz, idxRefs, bmpPool, curOff);
|
||||
|
@ -195,11 +195,11 @@ void AROTBuilder::Node::writeIndirectionTable(athena::io::MemoryWriter& w)
|
|||
w.writeUint32Big(nodeOff);
|
||||
if (childNodes.size())
|
||||
{
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x4) != 0) ; ++k)
|
||||
{
|
||||
for (int j=0 ; j < 1 + ((compSubdivs & 0x2) != 0) ; ++j)
|
||||
{
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x1) != 0) ; ++i)
|
||||
{
|
||||
int idx = k*4 + j*2 + i;
|
||||
childNodes[idx].writeIndirectionTable(w);
|
||||
|
@ -222,11 +222,11 @@ void AROTBuilder::Node::writeNodes(athena::io::MemoryWriter& w, int nodeIdx)
|
|||
|
||||
int childIndices[8];
|
||||
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x4) != 0) ; ++k)
|
||||
{
|
||||
for (int j=0 ; j < 1 + ((compSubdivs & 0x2) != 0) ; ++j)
|
||||
{
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x1) != 0) ; ++i)
|
||||
{
|
||||
int idx = k*4 + j*2 + i;
|
||||
w.writeUint16Big(curIdx);
|
||||
|
@ -236,11 +236,11 @@ void AROTBuilder::Node::writeNodes(athena::io::MemoryWriter& w, int nodeIdx)
|
|||
}
|
||||
}
|
||||
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x4) != 0) ; ++k)
|
||||
{
|
||||
for (int j=0 ; j < 1 + ((compSubdivs & 0x2) != 0) ; ++j)
|
||||
{
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x1) != 0) ; ++i)
|
||||
{
|
||||
int idx = k*4 + j*2 + i;
|
||||
childNodes[idx].writeNodes(w, childIndices[idx]);
|
||||
|
@ -255,11 +255,11 @@ void AROTBuilder::Node::advanceIndex(int& nodeIdx)
|
|||
++nodeIdx;
|
||||
if (childNodes.size())
|
||||
{
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((compSubdivs & 0x4) != 0) ; ++k)
|
||||
{
|
||||
for (int j=0 ; j < 1 + ((compSubdivs & 0x2) != 0) ; ++j)
|
||||
{
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((compSubdivs & 0x1) != 0) ; ++i)
|
||||
{
|
||||
int idx = k*4 + j*2 + i;
|
||||
childNodes[idx].advanceIndex(nodeIdx);
|
||||
|
|
|
@ -310,6 +310,9 @@ void ELSM<IDType>::_read(athena::io::YAMLDocReader& r)
|
|||
LogModule.report(logvisor::Warning, "short FourCC in element '%s'", elem.first.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (auto rec = r.enterSubRecord(elem.first.c_str()))
|
||||
{
|
||||
switch (*reinterpret_cast<const uint32_t*>(elem.first.data()))
|
||||
{
|
||||
case SBIG('LIFE'):
|
||||
|
@ -372,6 +375,9 @@ void ELSM<IDType>::_read(athena::io::YAMLDocReader& r)
|
|||
case SBIG('ZERY'):
|
||||
x70_ZERY.read(r);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -108,6 +108,8 @@ void SWSH<IDType>::_read(typename BigDNA::ReadYaml::StreamT& r)
|
|||
case SBIG('CRND'):
|
||||
x45_26_CRND = r.readBool(nullptr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -160,7 +160,7 @@ static void OutputOctreeNode(hecl::blender::PyOutStream& os, athena::io::MemoryR
|
|||
static const uint32_t AROTChildCounts[] = { 0, 2, 2, 4, 2, 4, 4, 8 };
|
||||
|
||||
/* AROT octree dumper */
|
||||
static void OutputOctreeNode(hecl::blender::PyOutStream& os, athena::io::MemoryReader& r,
|
||||
static void OutputOctreeNode(hecl::blender::PyOutStream& os, athena::io::IStreamReader& r,
|
||||
const zeus::CAABox& aabb)
|
||||
{
|
||||
r.readUint16Big();
|
||||
|
@ -171,19 +171,19 @@ static void OutputOctreeNode(hecl::blender::PyOutStream& os, athena::io::MemoryR
|
|||
r.seek(2 * childCount);
|
||||
|
||||
zeus::CAABox Z[2] = {aabb};
|
||||
if ((flags & 0x1) != 0)
|
||||
if ((flags & 0x4) != 0)
|
||||
aabb.splitZ(Z[0], Z[1]);
|
||||
for (int k=0 ; k < 1 + ((flags & 0x1) != 0) ; ++k)
|
||||
for (int k=0 ; k < 1 + ((flags & 0x4) != 0) ; ++k)
|
||||
{
|
||||
zeus::CAABox Y[2] = {Z[0]};
|
||||
zeus::CAABox Y[2] = {Z[k]};
|
||||
if ((flags & 0x2) != 0)
|
||||
Z[k].splitY(Y[0], Y[1]);
|
||||
for (int j=0 ; j < 1 + ((flags & 0x2) != 0) ; ++j)
|
||||
{
|
||||
zeus::CAABox X[2] = {Y[0]};
|
||||
if ((flags & 0x4) != 0)
|
||||
zeus::CAABox X[2] = {Y[j]};
|
||||
if ((flags & 0x1) != 0)
|
||||
Y[j].splitX(X[0], X[1]);
|
||||
for (int i=0 ; i < 1 + ((flags & 0x4) != 0) ; ++i)
|
||||
for (int i=0 ; i < 1 + ((flags & 0x1) != 0) ; ++i)
|
||||
{
|
||||
OutputOctreeNode(os, r, X[i]);
|
||||
}
|
||||
|
|
|
@ -23,13 +23,13 @@ namespace urde
|
|||
|
||||
static logvisor::Module Log("CBooRenderer");
|
||||
|
||||
static rstl::reserved_vector<CDrawable, 4096> sDataHolder;
|
||||
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, 4096>* 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;
|
||||
|
@ -119,6 +119,8 @@ void Buckets::Sort()
|
|||
rstl::reserved_vector<CDrawable*, 128>& bucket = (*sBuckets)[slot];
|
||||
if (bucket.size() < bucket.capacity())
|
||||
bucket.push_back(&drawable);
|
||||
//else
|
||||
// Log.report(logvisor::Fatal, "Full bucket!!!");
|
||||
}
|
||||
|
||||
u16 bucketIdx = u16(sBuckets->size());
|
||||
|
|
|
@ -31,7 +31,7 @@ class Buckets
|
|||
friend class CBooRenderer;
|
||||
|
||||
static rstl::reserved_vector<u16, 50> sBucketIndex;
|
||||
static rstl::reserved_vector<CDrawable, 4096>* 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;
|
||||
|
|
|
@ -626,21 +626,10 @@ void CBooModel::DrawSurfaces(const CModelFlags& flags) const
|
|||
}
|
||||
}
|
||||
|
||||
void CBooModel::DrawSurface(const CBooSurface& surf, const CModelFlags& flags) const
|
||||
static EExtendedShader ResolveExtendedShader(const MaterialSet::Material& data, const CModelFlags& flags)
|
||||
{
|
||||
//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];
|
||||
|
||||
const MaterialSet::Material& data = GetMaterialByIndex(surf.m_data.matIdx);
|
||||
if (data.flags.shadowOccluderMesh() && !g_DrawingOccluders)
|
||||
return;
|
||||
|
||||
bool noZWrite = flags.m_noZWrite || !data.flags.depthWrite();
|
||||
|
||||
const std::vector<boo::ObjToken<boo::IShaderDataBinding>>& extendeds = inst.m_shaderDataBindings[surf.selfIdx];
|
||||
EExtendedShader extended = EExtendedShader::Flat;
|
||||
if (flags.m_extendedShader == EExtendedShader::Lighting)
|
||||
{
|
||||
|
@ -698,11 +687,29 @@ void CBooModel::DrawSurface(const CBooSurface& surf, const CModelFlags& flags) c
|
|||
extended = EExtendedShader::Lighting;
|
||||
}
|
||||
}
|
||||
else if (flags.m_extendedShader < extendeds.size())
|
||||
else if (flags.m_extendedShader < EExtendedShader::MAX)
|
||||
{
|
||||
extended = flags.m_extendedShader;
|
||||
}
|
||||
|
||||
return extended;
|
||||
}
|
||||
|
||||
void CBooModel::DrawSurface(const CBooSurface& surf, const CModelFlags& flags) const
|
||||
{
|
||||
//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];
|
||||
|
||||
const MaterialSet::Material& data = GetMaterialByIndex(surf.m_data.matIdx);
|
||||
if (data.flags.shadowOccluderMesh() && !g_DrawingOccluders)
|
||||
return;
|
||||
|
||||
const std::vector<boo::ObjToken<boo::IShaderDataBinding>>& extendeds = inst.m_shaderDataBindings[surf.selfIdx];
|
||||
EExtendedShader extended = ResolveExtendedShader(data, flags);
|
||||
|
||||
boo::ObjToken<boo::IShaderDataBinding> binding = extendeds[extended];
|
||||
CGraphics::SetShaderDataBinding(binding);
|
||||
CGraphics::DrawArrayIndexed(surf.m_data.idxStart, surf.m_data.idxCount);
|
||||
|
|
|
@ -279,7 +279,8 @@ void CFluidPlaneShader::prepareDraw(const RenderSetupInfo& info,
|
|||
for (i=0 ; i<3 ; ++i)
|
||||
uni.m_lighting.colorRegs[i] = info.kColors[i];
|
||||
uni.m_lighting.mulColor = info.kColors[3];
|
||||
uni.m_lighting.fog.m_rangeScale = info.indScale;
|
||||
uni.m_lighting.fog = CGraphics::g_Fog;
|
||||
uni.m_pad2.x = info.indScale;
|
||||
m_uniBuf->unmap();
|
||||
}
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ private:
|
|||
zeus::CVector4f m_colorMul;
|
||||
zeus::CVector4f m_pad[3]; // rippleNormResolution, Pad out to 1280 bytes
|
||||
CModelShaders::LightingUniform m_lighting;
|
||||
zeus::CVector3f m_pad2; // Pad out to 768 bytes
|
||||
zeus::CVector3f m_pad2; // Pad out to 768 bytes, also holds ind scale
|
||||
};
|
||||
|
||||
TLockedToken<CTexture> m_patternTex1;
|
||||
|
|
|
@ -148,7 +148,11 @@ static std::string_view MainPostGLSL =
|
|||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
" return mix(colorIn, fog.color, clamp(fogZ, 0.0, 1.0));\n"
|
||||
"#ifdef BLEND_DST_ONE\n"
|
||||
" return vec4(mix(colorIn, vec4(0.0), clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return vec4(mix(colorIn, fog.color, clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"sv;
|
||||
|
||||
|
|
|
@ -144,7 +144,11 @@ static std::string_view MainPostHLSL =
|
|||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
" return lerp(colorIn, fog.color, saturate(fogZ));\n"
|
||||
"#ifdef BLEND_DST_ONE\n"
|
||||
" return float4(lerp(colorIn, float4(0.0), saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return float4(lerp(colorIn, fog.color, saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"sv;
|
||||
|
||||
|
|
|
@ -145,7 +145,11 @@ static std::string_view MainPostMetal =
|
|||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
" return mix(colorIn, lu.fog.color, saturate(fogZ));\n"
|
||||
"#ifdef BLEND_DST_ONE\n"
|
||||
" return float4(mix(colorIn, float4(0.0), saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return float4(mix(colorIn, lu.fog.color, saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"sv;
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@ u16 CParticleElectric::g_GlobalSeed = 99;
|
|||
CParticleElectric::CParticleElectric(const TToken<CElectricDescription>& token)
|
||||
: x1c_elecDesc(token), x14c_randState(g_GlobalSeed++)
|
||||
{
|
||||
x1bc_allocated.resize(32);
|
||||
|
||||
x450_24_emitting = true;
|
||||
x450_29_transformDirty = true;
|
||||
CElectricDescription* desc = x1c_elecDesc.GetObj();
|
||||
|
|
|
@ -49,8 +49,8 @@ private:
|
|||
zeus::CTransform x74_invOrientation;
|
||||
zeus::CVector3f xa4_globalTranslation;
|
||||
zeus::CTransform xb0_globalOrientation;
|
||||
zeus::CVector3f xe0_globalScale;
|
||||
zeus::CVector3f xec_localScale;
|
||||
zeus::CVector3f xe0_globalScale = zeus::CVector3f::skOne;
|
||||
zeus::CVector3f xec_localScale = zeus::CVector3f::skOne;
|
||||
zeus::CTransform xf8_cachedXf;
|
||||
float x128 = 0.f;
|
||||
float x12c = 0.f;
|
||||
|
|
|
@ -2139,7 +2139,7 @@ void CMorphBall::CollidedWith(TUniqueId id, const CCollisionInfoList& list, CSta
|
|||
}
|
||||
|
||||
if (wakeMaterial == EMaterialTypes::NoStepLogic && x1c0c_wakeEffectIdx != -1)
|
||||
x1bc8_wakeEffectGens[int(wakeMaterial)]->SetParticleEmission(false);
|
||||
x1bc8_wakeEffectGens[int(x1c0c_wakeEffectIdx)]->SetParticleEmission(false);
|
||||
|
||||
x1954_isProjectile = false;
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ void CScriptEffect::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSt
|
|||
if (x104_particleSystem && x104_particleSystem->SystemHasLight())
|
||||
{
|
||||
x108_lightId = mgr.AllocateUniqueId();
|
||||
mgr.AddObject(new CGameLight(x108_lightId, GetAreaIdAlways(), true,
|
||||
mgr.AddObject(new CGameLight(x108_lightId, GetAreaIdAlways(), GetActive(),
|
||||
std::string("EffectPLight_") + GetName().data(), x34_transform, GetUniqueId(),
|
||||
x104_particleSystem->GetLight(), x10c_partId.Value(), 1, 0.f));
|
||||
}
|
||||
|
|
|
@ -179,8 +179,9 @@ static const char* FS =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" vec4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"UBINDING2 uniform LightingUniform\n"
|
||||
|
@ -226,12 +227,46 @@ static const char* FS =
|
|||
"};\n"
|
||||
"\n"
|
||||
"SBINDING(0) in VertToFrag vtf;\n"
|
||||
"vec4 MainPostFunc(vec4 colorIn)\n"
|
||||
"{\n"
|
||||
" float fogZ, temp;\n"
|
||||
" switch (fog.mode)\n"
|
||||
" {\n"
|
||||
" case 2:\n"
|
||||
" fogZ = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n"
|
||||
" break;\n"
|
||||
" case 4:\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * (-vtf.mvPos.z - fog.start) * fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 5:\n"
|
||||
" temp = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" case 6:\n"
|
||||
" fogZ = exp2(-8.0 * (fog.start + vtf.mvPos.z) * fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 7:\n"
|
||||
" temp = (fog.start + vtf.mvPos.z) * fog.rangeScale;\n"
|
||||
" fogZ = exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" default:\n"
|
||||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
"#if %d\n"
|
||||
" return vec4(mix(colorIn, vec4(0.0), clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return vec4(mix(colorIn, fog.color, clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"layout(location=0) out vec4 colorOut;\n"
|
||||
"%s" // Textures here
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 lighting = LightingFunc(vtf.mvPos.xyz, normalize(vtf.mvNorm.xyz));\n"
|
||||
"%s" // Combiner expression here
|
||||
" colorOut = MainPostFunc(colorOut);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* FSDoor =
|
||||
|
@ -248,8 +283,9 @@ static const char* FSDoor =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" vec4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"UBINDING2 uniform LightingUniform\n"
|
||||
|
@ -592,7 +628,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info)
|
|||
combiner += " colorOut.a = kColor0.a;\n";
|
||||
|
||||
char *finalFSs;
|
||||
asprintf(&finalFSs, FS, textures.c_str(), combiner.c_str());
|
||||
asprintf(&finalFSs, FS, int(info.m_additive), textures.c_str(), combiner.c_str());
|
||||
std::string ret(finalFSs);
|
||||
free(finalFSs);
|
||||
return ret;
|
||||
|
|
|
@ -215,8 +215,9 @@ static const char* FS =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" float4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"cbuffer LightingUniform : register(b2)\n"
|
||||
|
@ -262,6 +263,39 @@ static const char* FS =
|
|||
" float2 uvs[7] : UV;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"static float4 MainPostFunc(in VertToFrag vtf, float4 colorIn)\n"
|
||||
"{\n"
|
||||
" float fogZ, temp;\n"
|
||||
" switch (fog.mode)\n"
|
||||
" {\n"
|
||||
" case 2:\n"
|
||||
" fogZ = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n"
|
||||
" break;\n"
|
||||
" case 4:\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * (-vtf.mvPos.z - fog.start) * fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 5:\n"
|
||||
" temp = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" case 6:\n"
|
||||
" fogZ = exp2(-8.0 * (fog.start + vtf.mvPos.z) * fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 7:\n"
|
||||
" temp = (fog.start + vtf.mvPos.z) * fog.rangeScale;\n"
|
||||
" fogZ = exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" default:\n"
|
||||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
"#if %d\n"
|
||||
" return float4(lerp(colorIn, float4(0.0), saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return float4(lerp(colorIn, fog.color, saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"SamplerState samp : register(s0);\n"
|
||||
"%s" // Textures here
|
||||
"float4 main(in VertToFrag vtf) : SV_Target0\n"
|
||||
|
@ -269,7 +303,7 @@ static const char* FS =
|
|||
" float4 lighting = LightingFunc(vtf.mvPos.xyz, normalize(vtf.mvNorm.xyz));\n"
|
||||
" float4 colorOut;\n"
|
||||
"%s" // Combiner expression here
|
||||
" return colorOut;\n"
|
||||
" return MainPostFunc(vtf, colorOut);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* FSDoor =
|
||||
|
@ -285,8 +319,9 @@ static const char* FSDoor =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" float4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"cbuffer LightingUniform : register(b2)\n"
|
||||
|
@ -622,7 +657,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info)
|
|||
combiner += " colorOut.a = kColor0.a;\n";
|
||||
|
||||
char *finalFS;
|
||||
asprintf(&finalFS, FS, textures.c_str(), combiner.c_str());
|
||||
asprintf(&finalFS, FS, int(info.m_additive), textures.c_str(), combiner.c_str());
|
||||
std::string ret(finalFS);
|
||||
free(finalFS);
|
||||
return ret;
|
||||
|
|
|
@ -199,8 +199,9 @@ static const char* FS =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" float4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"struct LightingUniform\n"
|
||||
|
@ -252,6 +253,39 @@ static const char* FS =
|
|||
" float2 uv6;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"float4 MainPostFunc(thread VertToFrag& vtf, constant LightingUniform& lu, float4 colorIn)\n"
|
||||
"{\n"
|
||||
" float fogZ, temp;\n"
|
||||
" switch (lu.fog.mode)\n"
|
||||
" {\n"
|
||||
" case 2:\n"
|
||||
" fogZ = (-vtf.mvPos.z - lu.fog.start) * lu.fog.rangeScale;\n"
|
||||
" break;\n"
|
||||
" case 4:\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * (-vtf.mvPos.z - lu.fog.start) * lu.fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 5:\n"
|
||||
" temp = (-vtf.mvPos.z - lu.fog.start) * lu.fog.rangeScale;\n"
|
||||
" fogZ = 1.0 - exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" case 6:\n"
|
||||
" fogZ = exp2(-8.0 * (lu.fog.start + vtf.mvPos.z) * lu.fog.rangeScale);\n"
|
||||
" break;\n"
|
||||
" case 7:\n"
|
||||
" temp = (lu.fog.start + vtf.mvPos.z) * lu.fog.rangeScale;\n"
|
||||
" fogZ = exp2(-8.0 * temp * temp);\n"
|
||||
" break;\n"
|
||||
" default:\n"
|
||||
" fogZ = 0.0;\n"
|
||||
" break;\n"
|
||||
" }\n"
|
||||
"#if %d\n"
|
||||
" return float4(mix(colorIn, float4(0.0), saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#else\n"
|
||||
" return float4(mix(colorIn, lu.fog.color, saturate(fogZ)).rgb, colorIn.a);\n"
|
||||
"#endif\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"fragment float4 fmain(VertToFrag vtf [[ stage_in ]],\n"
|
||||
" sampler samp [[ sampler(0) ]],\n"
|
||||
" constant LightingUniform& lu [[ buffer(4) ]]%s)\n" // Textures here
|
||||
|
@ -259,7 +293,7 @@ static const char* FS =
|
|||
" float4 lighting = LightingFunc(lu, vtf.mvPos.xyz, normalize(vtf.mvNorm.xyz));\n"
|
||||
" float4 colorOut;\n"
|
||||
"%s" // Combiner expression here
|
||||
" return colorOut;\n"
|
||||
" return MainPostFunc(vtf, lu, colorOut);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* FSDoor =
|
||||
|
@ -275,8 +309,9 @@ static const char* FSDoor =
|
|||
"{\n"
|
||||
" int mode;\n"
|
||||
" float4 color;\n"
|
||||
" float indScale;\n"
|
||||
" float rangeScale;\n"
|
||||
" float start;\n"
|
||||
" float indScale;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"struct LightingUniform\n"
|
||||
|
@ -614,7 +649,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info)
|
|||
combiner += " colorOut.a = lu.kColor0.a;\n";
|
||||
|
||||
char *finalFS;
|
||||
asprintf(&finalFS, FS, textures.c_str(), combiner.c_str());
|
||||
asprintf(&finalFS, FS, int(info.m_additive), textures.c_str(), combiner.c_str());
|
||||
std::string ret(finalFS);
|
||||
free(finalFS);
|
||||
return ret;
|
||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
|||
Subproject commit 0d7f6d7f5b5fba3ec79abaa754ed589b3705763a
|
||||
Subproject commit e83f40f5ca9c5f0bc7664bbda19c43574172f42e
|
Loading…
Reference in New Issue