// 1. Create a custom mob model
class MyCustomModel : public HumanoidModel {
public:
ModelPart* customPart;
MyCustomModel() : HumanoidModel(0.0f, 0.0f, 64, 64) {
// Add custom model part
customPart = new ModelPart(this, 0, 32);
customPart->addBox(-4, 0, -4, 8, 8, 8);
customPart->setPos(0, -8, 0);
}
void setupAnim(float time, float r, float bob,
float yRot, float xRot, float scale,
unsigned int override = 0) override {
// Call parent animation
HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, override);
// Custom animation
customPart->yRot = sinf(time * 0.1f) * 0.2f;
}
void render(shared_ptr<Entity> entity, float time, float r,
float bob, float yRot, float xRot,
float scale, bool usecompiled) override {
// Setup animation
setupAnim(time, r, bob, yRot, xRot, scale);
// Render base humanoid model
HumanoidModel::render(entity, time, r, bob, yRot, xRot, scale, usecompiled);
// Render custom part
customPart->render(scale, usecompiled);
}
};
// 2. Create a custom renderer
class MyCustomRenderer : public MobRenderer {
public:
MyCustomRenderer() : MobRenderer(new MyCustomModel(), 0.5f) {}
void render(shared_ptr<Entity> entity, double x, double y, double z,
float rot, float a) override {
// Bind custom texture
bindTexture(L"textures/entity/mycustom.png");
// Call parent render
MobRenderer::render(entity, x, y, z, rot, a);
}
void scale(shared_ptr<Mob> mob, float a) override {
// Make entity larger
glScalef(1.5f, 1.5f, 1.5f);
}
};
// 3. Register and use
EntityRenderDispatcher* dispatcher = /* ... */;
dispatcher->register(MyCustomEntity::TYPE_ID, new MyCustomRenderer());
// Entities will now be rendered with custom model and animation