ゲーム好きな豚のしっぽ

筆者の下手の横好きなゲーム日記、情報メモです。主にプレイするのはtrophymanager、WoT、WoWS、洋モノSLGなどの予定。

net.minecraft.client.renderer.entity.Render

注意事項

このリファレンスは筆者が記述した時点での拙い知識で翻訳、解釈したもののメモです。
誤訳や理解不足の可能性を多分に含みます。ご覧になる際はご注意ください。
ソースは1.8.9 - 11.15.1.1722のものを使用しています。

net.minecraft.client.renderer.entity.Render

レンダリングの仕組みを理解するために解析。
基本的にはRenderは同じ仕組みで動いているはずなのでRenderの実装クラスを作るときはこれと実装するEntityと類似したクラスの記述を参考に作ることにする。

クラス宣言
@SideOnly(Side.CLIENT)
public abstract class Render<T extends Entity>
フィールド
private static final ResourceLocation shadowTextures

影のテクスチャ

protected final RenderManager renderManager

レンダリングの多くを委譲されるインスタンス。内部に各クラスのレンダラをマップしており、随時呼び出してレンダリングする模様

protected float shadowSize

影のサイズ? 指定方法がわからない

protected float shadowOpaque

影の濃さを決定します。大きい数字ほど濃くなります。

コンストラクタ
protected Render(RenderManager renderManager)

protectedのため実装クラスからしか呼べない。実装クラスのコンストラクタRenderManagerからのみ呼ばれる。MODがこの辺りを操作することはない模様。

メソッド
public boolean shouldRender(T livingEntity, ICamera camera, double camX, double camY, double camZ)

エンティティをレンダリングするかどうかを返す。オーバーライドしているのはRenderGuardianのみ。

public void doRender(T entity, double x, double y, double z, float entityYaw, float partialTicks)

実際にレンダリングを行います。実際にはこのメソッドは合成メソッドで、引数をダウンキャストして実際に作業をするメソッドに引き継ぎます。
何かと思ったら共変戻り値の説明だったので以下略。要するにエンティティに適したレンダラをコンパイラが選択して適切に処理できるということ。

protected void renderName(T entity, double x, double y, double z)

必要であれば名前をレンダリングする。

protected boolean canRenderName(T entity)

名前をレンダリングするかどうかを返す。

protected void renderOffsetLivingLabel(T entityIn, double x, double y, double z, String str, float p_177069_9_, double p_177069_10_)

名前の表示位置を調整してレンダリングする。適切にクラスを継承していれば基本的にオーバーライドは不要。ただし、特殊な装備品や姿勢を実装している時は条件分岐で適切な位置に調整してあげる必要がある。

protected abstract ResourceLocation getEntityTexture(T entity);

エンティティのResourceLocationを返します。bindEntityTexture(T entity)を呼ばない限りなにも見えません。
動的にテクスチャを変更しない限りはstatic finalで宣言したResourceLocationを返せばよい。
エンティティを引数に受け取るので、受け取ったエンティティの属性によってテクスチャを変更するのは難しくない。

protected boolean bindEntityTexture(T entity)

getEntityTexture(T entity)を試みて成功したらtrueを返す。

public void bindTexture(ResourceLocation location)

指定された位置にあるテクスチャをレンダラに割り当てる

private void renderEntityOnFire(Entity entity, double x, double y, double z, float partialTicks)

エンティティの上に炎を描画する

private void renderShadow(Entity entityIn, double x, double y, double z, float shadowAlpha, float partialTicks)

エンティティの影を描写する

private World getWorldFromRenderManager()

RenderManagerが保有しているWorldオブジェクトを返す。
クライアント側のワールドが返る

public static void renderOffsetAABB(AxisAlignedBB boundingBox, double x, double y, double z)

指定された範囲を白い箱で置き換える
範囲内の描画のリセット

public void doRenderShadowAndFire(Entity entityIn, double x, double y, double z, float yaw, float partialTicks)

エンティティの影と炎(もし燃えていたら)を描画する
オーバーライドなし

public FontRenderer getFontRendererFromRenderManager()

レンダーマネージャーにセットされているフォントレンダーを返す

protected void renderLivingLabel(T entityIn, String str, double x, double y, double z, int maxDistance)

エンティティの頭上に名前をレンダリングする
実際の描画処理。

public RenderManager getRenderManager()

レンダーマネージャーを返す