More bug fixes

This commit is contained in:
Jack Andersen 2019-02-07 21:56:54 -10:00
parent 5f8b65e3b5
commit 88591f48f0
20 changed files with 102 additions and 74 deletions

View File

@ -201,28 +201,28 @@ void CBooRenderer::ActivateLightsForModel(CAreaListItem* item, CBooModel& model)
if (lightOctreeWords && !TestBit(lightOctreeWords, model.x44_areaInstanceIdx))
continue;
float radius = model.x20_aabb.intersectionRadius(zeus::CSphere(refLight.GetPosition(), refLight.GetRadius()));
bool foundLight = false;
for (int j = 0; j < i; ++j) {
if (lightRefs[j] == &refLight)
continue;
float radius = model.x20_aabb.intersectionRadius(zeus::CSphere(refLight.GetPosition(), refLight.GetRadius()));
if (radius < 0.f)
break;
if (lightRads[j] <= radius)
break;
lightRads[j] = radius;
lightRefs[j] = &refLight;
thisLights.push_back(refLight);
foundLight = true;
break;
}
if (foundLight)
continue;
float radius = model.x20_aabb.intersectionRadius(zeus::CSphere(refLight.GetPosition(), refLight.GetRadius()));
lightRads[i] = radius;
if (radius < 0.f)
continue;
lightRads[i] = radius;
lightRefs[i] = &refLight;
thisLights.push_back(refLight);
++i;

View File

@ -36,6 +36,14 @@ float CLight::GetIntensity() const {
return x48_cachedIntensity;
}
float CLight::GetRadius() const {
if (x4c_25_radiusDirty) {
const_cast<CLight*>(this)->x44_cachedRadius = CalculateLightRadius();
const_cast<CLight*>(this)->x4c_25_radiusDirty = false;
}
return x44_cachedRadius;
}
CLight::CLight(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color, float distC,
float distL, float distQ, float angleC, float angleL, float angleQ)
: x0_pos(pos)

View File

@ -89,17 +89,10 @@ public:
float GetAngleAttenuationLinear() const { return x34_angleL; }
float GetAngleAttenuationQuadratic() const { return x38_angleQ; }
float GetRadius() const {
if (x4c_25_radiusDirty) {
const_cast<CLight*>(this)->x44_cachedRadius = CalculateLightRadius();
const_cast<CLight*>(this)->x4c_25_radiusDirty = false;
}
return x44_cachedRadius;
}
ELightType GetType() const { return x1c_type; }
float GetIntensity() const;
float GetRadius() const;
const zeus::CColor& GetColor() const { return x18_color; }
zeus::CColor GetNormalIndependentLightingAtPoint(const zeus::CVector3f& point) const;

View File

@ -961,7 +961,7 @@ boo::ObjToken<boo::IGraphicsBufferD> CBooModel::UpdateUniformData(const CModelFl
lightingOut.colorRegs[1] = CGraphics::g_ColorRegs[1];
lightingOut.colorRegs[2] = CGraphics::g_ColorRegs[2];
lightingOut.mulColor = flags.x4_color;
lightingOut.ambient += flags.addColor;
lightingOut.addColor = flags.addColor;
lightingOut.fog = CGraphics::g_Fog;
}

View File

@ -55,6 +55,7 @@ public:
zeus::CColor ambient;
zeus::CColor colorRegs[3];
zeus::CColor mulColor;
zeus::CColor addColor;
CGraphics::CFogState fog;
void ActivateLights(const std::vector<CLight>& lts);

View File

@ -66,6 +66,7 @@ FOG_STRUCT_GLSL
" vec4 colorReg1;\n"
" vec4 colorReg2;\n"
" vec4 mulColor;\n"
" vec4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -116,6 +117,7 @@ static std::string_view LightingShadowGLSL =
" vec4 colorReg1;\n"
" vec4 colorReg2;\n"
" vec4 mulColor;\n"
" vec4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -167,11 +169,11 @@ static std::string_view ThermalPostGLSL =
"UBINDING2 uniform ThermalUniform\n"
"{\n"
" vec4 tmulColor;\n"
" vec4 addColor;\n"
" vec4 taddColor;\n"
"};\n"
"vec4 ThermalPostFunc(vec4 colorIn)\n"
"{\n"
" return vec4(texture(extTex7, vtf.extTcgs[0]).rrr * tmulColor.rgb + addColor.rgb, tmulColor.a + addColor.a);\n"
" return vec4(texture(extTex7, vtf.extTcgs[0]).rrr * tmulColor.rgb + taddColor.rgb, tmulColor.a + taddColor.a);\n"
"}\n"
"\n"sv;
@ -207,7 +209,7 @@ static std::string_view MBShadowPostGLSL =
static std::string_view DisintegratePostGLSL = FOG_STRUCT_GLSL
"UBINDING2 uniform DisintegrateUniform\n"
"{\n"
" vec4 addColor;\n"
" vec4 daddColor;\n"
" Fog fog;\n"
"};\n"
"vec4 DisintegratePostFunc(vec4 colorIn)\n"
@ -215,7 +217,7 @@ static std::string_view DisintegratePostGLSL = FOG_STRUCT_GLSL
" vec4 texel0 = texture(extTex7, vtf.extTcgs[0]);\n"
" vec4 texel1 = texture(extTex7, vtf.extTcgs[1]);\n"
" colorIn = mix(vec4(0.0), texel1, texel0);\n"
" colorIn.rgb += addColor.rgb;\n" FOG_ALGORITHM_GLSL
" colorIn.rgb += daddColor.rgb;\n" FOG_ALGORITHM_GLSL
"}\n"
"\n"sv;

View File

@ -65,6 +65,7 @@ FOG_STRUCT_HLSL
" float4 colorReg1;\n"
" float4 colorReg2;\n"
" float4 mulColor;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -114,6 +115,7 @@ static std::string_view LightingShadowHLSL =
" float4 colorReg1;\n"
" float4 colorReg2;\n"
" float4 mulColor;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -160,12 +162,12 @@ static std::string_view ThermalPostHLSL =
"cbuffer ThermalUniform : register(b2)\n"
"{\n"
" float4 tmulColor;\n"
" float4 addColor;\n"
" float4 taddColor;\n"
"};\n"
"static float4 ThermalPostFunc(in VertToFrag vtf, float4 colorIn)\n"
"{\n"
" return float4(extTex7.Sample(samp, vtf.extTcgs[0]).rrr * tmulColor.rgb + addColor.rgb, tmulColor.a + "
"addColor.a);\n"
" return float4(extTex7.Sample(samp, vtf.extTcgs[0]).rrr * tmulColor.rgb + taddColor.rgb, tmulColor.a + "
"taddColor.a);\n"
"}\n"
"\n"sv;
@ -201,7 +203,7 @@ static std::string_view MBShadowPostHLSL =
static std::string_view DisintegratePostHLSL = FOG_STRUCT_HLSL
"cbuffer DisintegrateUniform : register(b2)\n"
"{\n"
" float4 addColor;\n"
" float4 daddColor;\n"
" Fog fog;\n"
"};\n"
"static float4 DisintegratePostFunc(in VertToFrag vtf, float4 colorIn)\n"
@ -209,7 +211,7 @@ static std::string_view DisintegratePostHLSL = FOG_STRUCT_HLSL
" float4 texel0 = extTex7.Sample(samp, vtf.extTcgs[0]);\n"
" float4 texel1 = extTex7.Sample(samp, vtf.extTcgs[1]);\n"
" colorIn = lerp(float4(0.0,0.0,0.0,0.0), texel1, texel0);\n"
" colorIn.rgb += addColor.rgb;\n" FOG_ALGORITHM_HLSL
" colorIn.rgb += daddColor.rgb;\n" FOG_ALGORITHM_HLSL
"}\n"
"\n"sv;

View File

@ -65,6 +65,7 @@ FOG_STRUCT_METAL
" float4 colorReg1;\n"
" float4 colorReg2;\n"
" float4 mulColor;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -114,6 +115,7 @@ static std::string_view LightingShadowMetal =
" float4 colorReg1;\n"
" float4 colorReg2;\n"
" float4 mulColor;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -161,14 +163,14 @@ static std::string_view ThermalPostMetal =
"struct ThermalUniform\n"
"{\n"
" float4 tmulColor;\n"
" float4 addColor;\n"
" float4 taddColor;\n"
"};\n"
"static float4 EXTThermalPostFunc(thread VertToFrag& vtf, constant ThermalUniform& lu,\n"
" sampler samp, sampler clampSamp, texture2d<float> extTex7, float4 colorIn)\n"
"{\n"
" //return float4(vtf.extTcgs0.xy, 0.0, 1.0);\n"
" return float4(extTex7.sample(samp, vtf.extTcgs0).rrr * lu.tmulColor.rgb + lu.addColor.rgb,\n"
" lu.tmulColor.a + lu.addColor.a);\n"
" return float4(extTex7.sample(samp, vtf.extTcgs0).rrr * lu.tmulColor.rgb + lu.taddColor.rgb,\n"
" lu.tmulColor.a + lu.taddColor.a);\n"
"}\n"
"\n"sv;
@ -206,7 +208,7 @@ static std::string_view MBShadowPostMetal =
static std::string_view DisintegratePostMetal = FOG_STRUCT_METAL
"struct DisintegrateUniform\n"
"{\n"
" float4 addColor;\n"
" float4 daddColor;\n"
" Fog fog;\n"
"};\n"
"static float4 EXTDisintegratePostFunc(thread VertToFrag& vtf, constant DisintegrateUniform& lu, sampler samp,\n"
@ -215,7 +217,7 @@ static std::string_view DisintegratePostMetal = FOG_STRUCT_METAL
" float4 texel0 = extTex7.sample(samp, vtf.extTcgs0);\n"
" float4 texel1 = extTex7.sample(samp, vtf.extTcgs1);\n"
" colorIn = mix(float4(0.0), texel1, texel0);\n"
" colorIn.rgb += lu.addColor.rgb;\n" FOG_ALGORITHM_METAL
" colorIn.rgb += lu.daddColor.rgb;\n" FOG_ALGORITHM_METAL
"}\n"
"\n"sv;

View File

@ -15,8 +15,8 @@ CFlickerBat::CFlickerBat(TUniqueId uid, std::string_view name, CPatterned::EFlav
colType, EBodyType::Pitchable, actParms, EKnockBackVariant::Small)
, x580_24_wasInXray(false)
, x580_25_heardShot(false)
, x580_26_(false)
, x580_27_(b2)
, x580_26_inLOS(false)
, x580_27_enableLOSCheck(b2)
, x574_state(EFlickerBatState(b1)) {
SetupPlayerCollision(b1);
@ -45,26 +45,26 @@ void CFlickerBat::Think(float dt, CStateManager& mgr) {
x402_29_drawParticles = mgr.GetPlayerState()->GetActiveVisor(mgr) != CPlayerState::EPlayerVisor::XRay;
if (GetFlickerBatState() == EFlickerBatState::Two || GetFlickerBatState() == EFlickerBatState::Three) {
x578_ -= dt;
if (x578_ <= 0.f) {
if (GetFlickerBatState() == EFlickerBatState::Two)
SetFlickerBatState(EFlickerBatState::Zero, mgr);
if (GetFlickerBatState() == EFlickerBatState::FadeIn || GetFlickerBatState() == EFlickerBatState::FadeOut) {
x578_fadeRemTime -= dt;
if (x578_fadeRemTime <= 0.f) {
if (GetFlickerBatState() == EFlickerBatState::FadeIn)
SetFlickerBatState(EFlickerBatState::Visible, mgr);
else
SetFlickerBatState(EFlickerBatState::One, mgr);
SetFlickerBatState(EFlickerBatState::Hidden, mgr);
}
}
bool inXray = mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::XRay;
if (inXray != x580_24_wasInXray) {
if (inXray) {
if (GetFlickerBatState() == EFlickerBatState::One) {
if (GetFlickerBatState() == EFlickerBatState::Hidden) {
AddMaterial(EMaterialTypes::Target, EMaterialTypes::Orbit, mgr);
SetMuted(false);
}
CreateShadow(false);
} else {
if (GetFlickerBatState() == EFlickerBatState::One) {
if (GetFlickerBatState() == EFlickerBatState::Hidden) {
RemoveMaterial(EMaterialTypes::Target, EMaterialTypes::Orbit, mgr);
SetMuted(true);
}
@ -75,11 +75,11 @@ void CFlickerBat::Think(float dt, CStateManager& mgr) {
float alpha = 0.f;
if (!x580_24_wasInXray) {
if (GetFlickerBatState() == EFlickerBatState::Zero)
if (GetFlickerBatState() == EFlickerBatState::Visible)
alpha = 1.f;
else if (GetFlickerBatState() == EFlickerBatState::Two || GetFlickerBatState() == EFlickerBatState::Three) {
alpha = x578_ * x57c_;
if (GetFlickerBatState() == EFlickerBatState::Two)
else if (GetFlickerBatState() == EFlickerBatState::FadeIn || GetFlickerBatState() == EFlickerBatState::FadeOut) {
alpha = x578_fadeRemTime * x57c_ooFadeDur;
if (GetFlickerBatState() == EFlickerBatState::FadeIn)
alpha = 1.f - alpha;
}
} else
@ -90,26 +90,26 @@ void CFlickerBat::Think(float dt, CStateManager& mgr) {
bool targetable = true;
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::XRay &&
(x574_state == EFlickerBatState::Zero || x574_state == EFlickerBatState::Two))
(x574_state == EFlickerBatState::Visible || x574_state == EFlickerBatState::FadeIn))
targetable = false;
xe7_31_targetable = targetable;
CPatterned::Think(dt, mgr);
}
void CFlickerBat::Render(const CStateManager& mgr) const {
if (!x580_24_wasInXray && x580_26_ &&
(GetFlickerBatState() == EFlickerBatState::Two || GetFlickerBatState() == EFlickerBatState::Three)) {
if (!x580_24_wasInXray && x580_26_inLOS &&
(GetFlickerBatState() == EFlickerBatState::FadeIn || GetFlickerBatState() == EFlickerBatState::FadeOut)) {
float strength = 0.f;
if (GetFlickerBatState() == EFlickerBatState::Two) {
strength = 4.f * (x578_ - .75f);
} else if (GetFlickerBatState() == EFlickerBatState::Three) {
strength = 4.f * x578_;
if (GetFlickerBatState() == EFlickerBatState::FadeIn) {
strength = 4.f * (x578_fadeRemTime - .75f);
} else if (GetFlickerBatState() == EFlickerBatState::FadeOut) {
strength = 4.f * x578_fadeRemTime;
}
if (strength > 0.f && strength < 1.f)
mgr.DrawSpaceWarp(GetTranslation(), 0.3f * std::sin(M_PIF * strength));
}
if (x580_26_) {
if (x580_26_inLOS) {
mgr.SetupFogForAreaNonCurrent(GetAreaIdAlways());
CPatterned::Render(mgr);
mgr.SetupFogForArea(GetAreaIdAlways());
@ -136,12 +136,12 @@ void CFlickerBat::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node,
}
void CFlickerBat::Death(CStateManager& mgr, const zeus::CVector3f& direction, EScriptObjectState state) {
SetFlickerBatState(EFlickerBatState::Zero, mgr);
SetFlickerBatState(EFlickerBatState::Visible, mgr);
CPatterned::Death(mgr, direction, state);
}
bool CFlickerBat::CanBeShot(CStateManager& mgr, int) {
return (GetFlickerBatState() == EFlickerBatState::Zero || GetFlickerBatState() == EFlickerBatState::Two ||
return (GetFlickerBatState() == EFlickerBatState::Visible || GetFlickerBatState() == EFlickerBatState::FadeIn ||
mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::XRay);
}
@ -196,15 +196,15 @@ void CFlickerBat::SetFlickerBatState(EFlickerBatState state, CStateManager& mgr)
}
void CFlickerBat::FlickerBatStateChanged(EFlickerBatState state, CStateManager& mgr) {
if (state == EFlickerBatState::Zero) {
if (state == EFlickerBatState::Visible) {
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::XRay)
CreateShadow(true);
AddMaterial(EMaterialTypes::Target, mgr);
} else if (state == EFlickerBatState::One) {
} else if (state == EFlickerBatState::Hidden) {
SetMuted(true);
RemoveMaterial(EMaterialTypes::Target, mgr);
} else if (state == EFlickerBatState::Two) {
} else if (state == EFlickerBatState::FadeIn) {
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::XRay) {
CreateShadow(true);
SetMuted(false);
@ -212,7 +212,7 @@ void CFlickerBat::FlickerBatStateChanged(EFlickerBatState state, CStateManager&
CheckStaticIntersection(mgr);
SetupPlayerCollision(true);
} else if (state == EFlickerBatState::Three) {
} else if (state == EFlickerBatState::FadeOut) {
if (mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::XRay)
CreateShadow(true);
@ -222,8 +222,8 @@ void CFlickerBat::FlickerBatStateChanged(EFlickerBatState state, CStateManager&
}
void CFlickerBat::CheckStaticIntersection(CStateManager& mgr) {
if (!x580_27_) {
x580_26_ = false;
if (!x580_27_enableLOSCheck) {
x580_26_inLOS = false;
return;
}
@ -231,7 +231,7 @@ void CFlickerBat::CheckStaticIntersection(CStateManager& mgr) {
zeus::CVector3f diff = GetBoundingBox().center() - camPos;
float mag = diff.magnitude();
diff *= zeus::CVector3f(1.f / mag);
x580_26_ = CGameCollision::RayStaticIntersectionBool(mgr, camPos, diff, mag,
x580_26_inLOS = CGameCollision::RayStaticIntersectionBool(mgr, camPos, diff, mag,
CMaterialFilter::MakeExclude({EMaterialTypes::SeeThrough}));
}
@ -244,12 +244,12 @@ void CFlickerBat::NotifyNeighbors(CStateManager& mgr) {
}
void CFlickerBat::ToggleVisible(CStateManager& mgr) {
if (GetFlickerBatState() == EFlickerBatState::Zero || GetFlickerBatState() == EFlickerBatState::Two)
SetFlickerBatState(EFlickerBatState::Three, mgr);
if (GetFlickerBatState() == EFlickerBatState::Visible || GetFlickerBatState() == EFlickerBatState::FadeIn)
SetFlickerBatState(EFlickerBatState::FadeOut, mgr);
else
SetFlickerBatState(EFlickerBatState::Two, mgr);
SetFlickerBatState(EFlickerBatState::FadeIn, mgr);
x578_ = 1.f;
x57c_ = 1.f / x578_;
x578_fadeRemTime = 1.f;
x57c_ooFadeDur = 1.f / x578_fadeRemTime;
}
} // namespace urde::MP1

View File

@ -5,19 +5,19 @@
namespace urde::MP1 {
class CFlickerBat final : public CPatterned {
public:
enum class EFlickerBatState { Zero, One, Two, Three };
enum class EFlickerBatState { Visible, Hidden, FadeIn, FadeOut };
private:
float x568_ = 0.f;
float x56c_ = 0.f;
float x570_ = 0.f;
EFlickerBatState x574_state;
float x578_ = 1.f;
float x57c_ = 0.f;
float x578_fadeRemTime = 1.f;
float x57c_ooFadeDur = 0.f;
bool x580_24_wasInXray : 1;
bool x580_25_heardShot : 1;
bool x580_26_ : 1;
bool x580_27_ : 1;
bool x580_26_inLOS : 1;
bool x580_27_enableLOSCheck : 1;
void NotifyNeighbors(CStateManager&);
void ToggleVisible(CStateManager&);

View File

@ -65,7 +65,7 @@ void CMetaree::Touch(CActor& act, CStateManager& mgr) {
}
}
void CMetaree::CollidedWith(TUniqueId& id, const CCollisionInfoList& colList, CStateManager& mgr) {
void CMetaree::CollidedWith(TUniqueId id, const CCollisionInfoList& colList, CStateManager& mgr) {
if (!x400_25_alive || colList.GetCount() <= 0)
return;

View File

@ -40,7 +40,7 @@ public:
void Think(float, CStateManager&);
void Touch(CActor&, CStateManager&);
void CollidedWith(TUniqueId&, const CCollisionInfoList&, CStateManager&);
void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&);
void ThinkAboutMove(float){};
bool Delay(CStateManager&, float) { return x330_stateMachineState.GetTime() > x568_delay; }
void Explode(CStateManager&, EStateMsg, float);

View File

@ -78,8 +78,9 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana
case EScriptObjectMessage::Deleted: // 34
{
RemoveEmitter();
if (HasModelData() && x64_modelData->AnimationData() && x64_modelData->GetNormalModel())
x64_modelData->AnimationData()->GetParticleDB().DeleteAllLights(mgr);
if (HasModelData() && !x64_modelData->IsNull())
if (CAnimData* aData = x64_modelData->AnimationData())
aData->GetParticleDB().DeleteAllLights(mgr);
break;
}
case EScriptObjectMessage::Registered: // 33

View File

@ -1552,6 +1552,18 @@ void CPatterned::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) {
CActor::PreRender(mgr, frustum);
}
void CPatterned::AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const {
if (x402_29_drawParticles) {
if (x64_modelData && !x64_modelData->IsNull()) {
int mask, target;
mgr.GetCharacterRenderMaskAndTarget(x402_31_thawed, mask, target);
if (CAnimData* aData = x64_modelData->AnimationData())
aData->GetParticleDB().AddToRendererClippedMasked(frustum, mask, target);
}
}
CActor::AddToRenderer(frustum, mgr);
}
void CPatterned::RenderIceModelWithFlags(const CModelFlags& flags) const {
CModelFlags useFlags = flags;
useFlags.x1_matSetIdx = 0;

View File

@ -261,6 +261,7 @@ public:
void PreThink(float, CStateManager& mgr) { CEntity::Think(x500_preThinkDt, mgr); }
void Think(float, CStateManager&);
void PreRender(CStateManager&, const zeus::CFrustum&);
void AddToRenderer(const zeus::CFrustum&, const CStateManager&) const;
void Render(const CStateManager& mgr) const;
void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager& mgr);

View File

@ -192,6 +192,7 @@ static const char* FS =
" vec4 kColor1;\n"
" vec4 kColor2;\n"
" vec4 kColor3;\n"
" vec4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -297,6 +298,7 @@ static const char* FSDoor =
" vec4 kColor1;\n"
" vec4 kColor2;\n"
" vec4 kColor3;\n"
" vec4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"

View File

@ -228,6 +228,7 @@ static const char* FS =
" float4 kColor1;\n"
" float4 kColor2;\n"
" float4 kColor3;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -332,6 +333,7 @@ static const char* FSDoor =
" float4 kColor1;\n"
" float4 kColor2;\n"
" float4 kColor3;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"struct VertToFrag\n"

View File

@ -212,6 +212,7 @@ static const char* FS =
" float4 kColor1;\n"
" float4 kColor2;\n"
" float4 kColor3;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"
@ -322,6 +323,7 @@ static const char* FSDoor =
" float4 kColor1;\n"
" float4 kColor2;\n"
" float4 kColor3;\n"
" float4 addColor;\n"
" Fog fog;\n"
"};\n"
"\n"

2
hecl

@ -1 +1 @@
Subproject commit c4e21d26fe456c6ed089840763b6d751a2a2bed8
Subproject commit 8357df410e1a0d7671e70f0446342dd8b9268d02

@ -1 +1 @@
Subproject commit 87e1106c601e163a991f5b9290241a060e7df617
Subproject commit 7b0ccb0c953d84cdcfd16a6c97ae3800d83bcceb