Skip to content

Commit

Permalink
Use interfaces instead of abstract classes
Browse files Browse the repository at this point in the history
  • Loading branch information
misode committed Dec 6, 2024
1 parent 1af239f commit 1c7ddca
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 170 deletions.
63 changes: 25 additions & 38 deletions src/render/ItemModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@ export interface ItemModelProvider {
getItemModel(id: Identifier): ItemModel | null
}

export abstract class ItemModel {

public abstract getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh

export interface ItemModel {
getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh
}

const MISSING_MESH: Mesh = new Mesh() ///TODO
Expand Down Expand Up @@ -69,21 +67,19 @@ export namespace ItemModel {
}
}

export class Empty extends ItemModel {
public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh{
export class Empty {
public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
return new Mesh()
}
}

export class Model extends ItemModel {
export class Model {
constructor(
private readonly modelId: Identifier,
private readonly tints: ItemTint[]
) {
super()
}
private readonly tints: ItemTint[],
) {}

public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh{
public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
const model = resources.getBlockModel(this.modelId)
if (!model) {
throw new Error(`Model ${this.modelId} does not exist (trying to render ${item.toString()})`)
Expand All @@ -104,12 +100,10 @@ export namespace ItemModel {

}

export class Composite extends ItemModel {
export class Composite {
constructor(
private readonly models: ItemModel[]
) {
super()
}
private readonly models: ItemModel[],
) {}

public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
const mesh = new Mesh()
Expand All @@ -118,20 +112,18 @@ export namespace ItemModel {
}
}

export class Condition extends ItemModel {
export class Condition {
constructor(
private readonly property: (item: ItemStack, context: ItemRenderingContext) => boolean,
private readonly onTrue: ItemModel,
private readonly onFalse: ItemModel
) {
super()
}
private readonly onFalse: ItemModel,
) {}

public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
return (this.property(item, context) ? this.onTrue : this.onFalse).getMesh(item, resources, context)
}

static propertyFromJson(root: {[x: string]: unknown}): (item: ItemStack, context: ItemRenderingContext) => boolean{
static propertyFromJson(root: {[x: string]: unknown}): (item: ItemStack, context: ItemRenderingContext) => boolean {
const property = Json.readString(root.property)?.replace(/^minecraft:/, '')

switch (property){
Expand Down Expand Up @@ -177,21 +169,19 @@ export namespace ItemModel {
}
}

export class Select extends ItemModel {
export class Select {
constructor(
private readonly property: (item: ItemStack, context: ItemRenderingContext) => string | null,
private readonly cases: Map<string, ItemModel>,
private readonly fallback?: ItemModel
) {
super()
}
private readonly fallback?: ItemModel,
) {}

public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
const value = this.property(item, context)
return ((value !== null ? this.cases.get(value) : undefined) ?? this.fallback)?.getMesh(item, resources, context) ?? MISSING_MESH
}

static propertyFromJson(root: {[x: string]: unknown}): (item: ItemStack, context: ItemRenderingContext) => string | null{
static propertyFromJson(root: {[x: string]: unknown}): (item: ItemStack, context: ItemRenderingContext) => string | null {
const property = Json.readString(root.property)?.replace(/^minecraft:/, '')

switch (property){
Expand Down Expand Up @@ -255,16 +245,15 @@ export namespace ItemModel {
}
}

export class RangeDispatch extends ItemModel {
export class RangeDispatch {
private readonly entries: {threshold: number, model: ItemModel}[]

constructor(
private readonly property: (item: ItemStack, context: ItemRenderingContext) => number,
private readonly scale: number,
entries: {threshold: number, model: ItemModel}[],
private readonly fallback?: ItemModel
private readonly fallback?: ItemModel,
) {
super()
this.entries = entries.sort((a, b) => a.threshold - b.threshold)
}

Expand Down Expand Up @@ -375,13 +364,11 @@ export namespace ItemModel {
}
}

export class Special extends ItemModel {
export class Special {
constructor(
private readonly specialModel: SpecialModel,
private readonly base: Identifier
) {
super()
}
private readonly base: Identifier,
) {}

public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
const mesh = this.specialModel.getMesh(item, resources)
Expand All @@ -394,7 +381,7 @@ export namespace ItemModel {
}
}

export class BundleSelectedItem extends ItemModel {
export class BundleSelectedItem {
public getMesh(item: ItemStack, resources: ItemRendererResources, context: ItemRenderingContext): Mesh {
const selectedItemIndex = context['bundle/selected_item']
if (selectedItemIndex === undefined || selectedItemIndex < 0) return new Mesh()
Expand Down
70 changes: 18 additions & 52 deletions src/render/ItemTint.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { ItemRenderingContext, ItemStack } from '../index.js'
import { Color, Json, PotionContents } from '../index.js'

export abstract class ItemTint {
public abstract getTint(item: ItemStack, context: ItemRenderingContext): Color
export interface ItemTint {
getTint(item: ItemStack, context: ItemRenderingContext): Color
}

const INVALID_COLOR: Color = [0, 0, 0]
Expand Down Expand Up @@ -43,24 +43,16 @@ export namespace ItemTint {
}
}

export class Constant extends ItemTint{
constructor(
public value: Color
) {
super()
}
export class Constant {
constructor(public value: Color) {}

public getTint(item: ItemStack): Color {
return this.value
}
}

export class Dye extends ItemTint{
constructor(
public default_color: Color
) {
super()
}
export class Dye {
constructor(public default_color: Color) {}

public getTint(item: ItemStack): Color {
const tag = item.getComponent('dyed_color')
Expand All @@ -74,25 +66,16 @@ export namespace ItemTint {
}
}

export class Grass extends ItemTint{
constructor(
public temperature: number,
public downfall: number
) {
super()
}
export class Grass {
constructor(public temperature: number, public downfall: number) {}

public getTint(item: ItemStack): Color {
return [124 / 255, 189 / 255, 107 / 255] // TODO: this is hardcoded to the same value as for blocks
}
}

export class Firework extends ItemTint{
constructor(
public default_color: Color
) {
super()
}
export class Firework {
constructor(public default_color: Color) {}

public getTint(item: ItemStack): Color {
const tag = item.getComponent('firework_explosion')
Expand Down Expand Up @@ -122,12 +105,8 @@ export namespace ItemTint {
}
}

export class Potion extends ItemTint {
constructor(
public default_color: Color
) {
super()
}
export class Potion {
constructor(public default_color: Color) {}

public getTint(item: ItemStack): Color {
const tag = item.getComponent('potion_contents')
Expand All @@ -139,12 +118,8 @@ export namespace ItemTint {
}
}

export class MapColor extends ItemTint {
constructor(
public default_color: Color
) {
super()
}
export class MapColor {
constructor(public default_color: Color) {}

public getTint(item: ItemStack): Color {
const mapColor = item.getComponent('map_color')
Expand All @@ -155,13 +130,8 @@ export namespace ItemTint {
}
}

export class CustomModelData extends ItemTint {
constructor(
public index: number,
public default_color: Color
) {
super()
}
export class CustomModelData {
constructor(public index: number, public default_color: Color) {}

public getTint(item: ItemStack): Color {
const tag = item.getComponent('custom_model_data')
Expand All @@ -176,12 +146,8 @@ export namespace ItemTint {
}
}

export class Team extends ItemTint {
constructor(
public default_color: Color
) {
super()
}
export class Team {
constructor(public default_color: Color) {}

public getTint(item: ItemStack, context: ItemRenderingContext): Color {
return context.context_entity_team_color ?? this.default_color
Expand Down
Loading

0 comments on commit 1c7ddca

Please sign in to comment.