aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/CreeperRenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/CreeperRenderer.cpp')
-rw-r--r--Minecraft.Client/CreeperRenderer.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/Minecraft.Client/CreeperRenderer.cpp b/Minecraft.Client/CreeperRenderer.cpp
new file mode 100644
index 00000000..483d14e3
--- /dev/null
+++ b/Minecraft.Client/CreeperRenderer.cpp
@@ -0,0 +1,90 @@
+#include "stdafx.h"
+#include "CreeperRenderer.h"
+#include "CreeperModel.h"
+#include "..\Minecraft.World\net.minecraft.world.entity.monster.h"
+#include "..\Minecraft.World\Mth.h"
+
+CreeperRenderer::CreeperRenderer() : MobRenderer( new CreeperModel(), 0.5f )
+{
+ armorModel = new CreeperModel(2);
+}
+
+void CreeperRenderer::scale(shared_ptr<Mob> mob, float a)
+{
+ shared_ptr<Creeper> creeper = dynamic_pointer_cast<Creeper>(mob);
+
+ float g = creeper->getSwelling(a);
+
+ float wobble = 1.0f + Mth::sin(g * 100) * g * 0.01f;
+ if (g < 0) g = 0;
+ if (g > 1) g = 1;
+ g = g * g;
+ g = g * g;
+ float s = (1.0f + g * 0.4f) * wobble;
+ float hs = (1.0f + g * 0.1f) / wobble;
+ glScalef(s, hs, s);
+}
+
+int CreeperRenderer::getOverlayColor(shared_ptr<Mob> mob, float br, float a)
+{
+ shared_ptr<Creeper> creeper = dynamic_pointer_cast<Creeper>(mob);
+
+ float step = creeper->getSwelling(a);
+
+ if ((int) (step * 10) % 2 == 0) return 0;
+
+ int _a = (int) (step * 0.2f * 255) + 25; // 4J - added 25 here as our entities are rendered with alpha test still enabled, and so anything less is invisible
+ if (_a < 0) _a = 0;
+ if (_a > 255) _a = 255;
+
+ int r = 255;
+ int g = 255;
+ int b = 255;
+
+ return (_a << 24) | (r << 16) | (g << 8) | b;
+}
+
+int CreeperRenderer::prepareArmor(shared_ptr<Mob> _mob, int layer, float a)
+{
+ // 4J - dynamic cast required because we aren't using templates/generics in our version
+ shared_ptr<Creeper> mob = dynamic_pointer_cast<Creeper>(_mob);
+ if (mob->isPowered())
+ {
+ if (mob->isInvisible()) glDepthMask(false);
+ else glDepthMask(true);
+
+ if (layer == 1)
+ {
+ float time = mob->tickCount + a;
+ bindTexture(TN_POWERED_CREEPER);// was L"/armor/power.png");
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ float uo = time * 0.01f;
+ float vo = time * 0.01f;
+ glTranslatef(uo, vo, 0);
+ setArmor(armorModel);
+ glMatrixMode(GL_MODELVIEW);
+ glEnable(GL_BLEND);
+ float br = 0.5f;
+ glColor4f(br, br, br, 1);
+ glDisable(GL_LIGHTING);
+ glBlendFunc(GL_ONE, GL_ONE);
+ return 1;
+ }
+ if (layer == 2)
+ {
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glEnable(GL_LIGHTING);
+ glDisable(GL_BLEND);
+ }
+ }
+ return -1;
+
+}
+
+int CreeperRenderer::prepareArmorOverlay(shared_ptr<Mob> mob, int layer, float a)
+{
+ return -1;
+} \ No newline at end of file