MinecraftConsoles/Minecraft.Client/ClockTexture.cpp
Riley M. c0da06e4ee
major: Switch to forward slashes(+more) to fix compilation on Linux (#1403)
Notably also adds some metadata files for NixOS 

* add support for linux clang cross compiles

* add linux clang instructions

* un-capitalize Mob.horse.*

* update the description in flake.nix

---------

Co-authored-by: Loki <lokirautio@gmail.com>
2026-04-14 16:47:37 -05:00

119 lines
2.5 KiB
C++

#include "stdafx.h"
#include "Minecraft.h"
#include "../Minecraft.World/net.minecraft.world.level.h"
#include "../Minecraft.World/net.minecraft.world.level.dimension.h"
#include "MultiPlayerLocalPlayer.h"
#include "../Minecraft.World/JavaMath.h"
#include "Texture.h"
#include "ClockTexture.h"
ClockTexture::ClockTexture() : StitchedTexture(L"clock", L"clock")
{
rot = rota = 0.0;
m_dataTexture = nullptr;
m_iPad = XUSER_INDEX_ANY;
}
ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"clock", L"clock")
{
rot = rota = 0.0;
m_dataTexture = dataTexture;
m_iPad = iPad;
}
void ClockTexture::cycleFrames()
{
Minecraft *mc = Minecraft::GetInstance();
double rott = 0;
if (m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT && mc->level != nullptr && mc->localplayers[m_iPad] != nullptr)
{
float time = mc->localplayers[m_iPad]->level->getTimeOfDay(1);
rott = time;
if (!mc->localplayers[m_iPad]->level->dimension->isNaturalDimension())
{
rott = Math::random();
}
}
else
{
// 4J Stu - For the static version, pretend we are already on a frame other than 0
frame = 1;
}
double rotd = rott - rot;
while (rotd < -.5)
rotd += 1.0;
while (rotd >= .5)
rotd -= 1.0;
if (rotd < -1) rotd = -1;
if (rotd > 1) rotd = 1;
rota += rotd * 0.1;
rota *= 0.8;
rot += rota;
// 4J Stu - We share data with another texture
if(m_dataTexture != nullptr)
{
int newFrame = static_cast<int>((rot + 1.0) * m_dataTexture->frames->size()) % m_dataTexture->frames->size();
while (newFrame < 0)
{
newFrame = (newFrame + m_dataTexture->frames->size()) % m_dataTexture->frames->size();
}
if (newFrame != frame)
{
frame = newFrame;
m_dataTexture->source->blit(x, y, m_dataTexture->frames->at(this->frame), rotated);
}
}
else
{
int newFrame = static_cast<int>((rot + 1.0) * frames->size()) % frames->size();
while (newFrame < 0)
{
newFrame = (newFrame + frames->size()) % frames->size();
}
if (newFrame != frame)
{
frame = newFrame;
source->blit(x, y, frames->at(this->frame), rotated);
}
}
}
int ClockTexture::getSourceWidth() const
{
return source->getWidth();
}
int ClockTexture::getSourceHeight() const
{
return source->getHeight();
}
int ClockTexture::getFrames()
{
if(m_dataTexture == nullptr)
{
return StitchedTexture::getFrames();
}
else
{
return m_dataTexture->getFrames();
}
}
void ClockTexture::freeFrameTextures()
{
if(m_dataTexture == nullptr)
{
StitchedTexture::freeFrameTextures();
}
}
bool ClockTexture::hasOwnData()
{
return m_dataTexture == nullptr;
}