mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
prevent duplicate texture loading
This commit is contained in:
parent
6d8a2412cb
commit
746620d549
@ -59,7 +59,7 @@ enum class EntityMetaDataFields(val defaultValue: Any? = null) {
|
|||||||
AREA_EFFECT_CLOUD_RADIUS(0.5f),
|
AREA_EFFECT_CLOUD_RADIUS(0.5f),
|
||||||
AREA_EFFECT_CLOUD_COLOR(0),
|
AREA_EFFECT_CLOUD_COLOR(0),
|
||||||
AREA_EFFECT_CLOUD_WAITING(false),
|
AREA_EFFECT_CLOUD_WAITING(false),
|
||||||
AREA_EFFECT_CLOUD_PARTICLE(ParticleData(ParticleType(ResourceLocation("effect")))),
|
AREA_EFFECT_CLOUD_PARTICLE(ParticleData(ParticleType(ResourceLocation("effect"), mutableListOf()))),
|
||||||
|
|
||||||
ABSTRACT_ARROW_FLAGS(0.toByte()),
|
ABSTRACT_ARROW_FLAGS(0.toByte()),
|
||||||
ABSTRACT_ARROW_PIERCE_LEVEL(0.toByte()),
|
ABSTRACT_ARROW_PIERCE_LEVEL(0.toByte()),
|
||||||
|
@ -17,10 +17,11 @@ import de.bixilon.minosoft.data.mappings.ResourceLocation
|
|||||||
import de.bixilon.minosoft.data.mappings.registry.RegistryItem
|
import de.bixilon.minosoft.data.mappings.registry.RegistryItem
|
||||||
import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer
|
import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer
|
||||||
import de.bixilon.minosoft.data.mappings.versions.Registries
|
import de.bixilon.minosoft.data.mappings.versions.Registries
|
||||||
|
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
||||||
|
|
||||||
data class ParticleType(
|
data class ParticleType(
|
||||||
override val resourceLocation: ResourceLocation,
|
override val resourceLocation: ResourceLocation,
|
||||||
// ToDo
|
val textures: List<ResourceLocation>,
|
||||||
) : RegistryItem {
|
) : RegistryItem {
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
@ -29,7 +30,14 @@ data class ParticleType(
|
|||||||
|
|
||||||
companion object : ResourceLocationDeserializer<ParticleType> {
|
companion object : ResourceLocationDeserializer<ParticleType> {
|
||||||
override fun deserialize(mappings: Registries?, resourceLocation: ResourceLocation, data: JsonObject): ParticleType {
|
override fun deserialize(mappings: Registries?, resourceLocation: ResourceLocation, data: JsonObject): ParticleType {
|
||||||
return ParticleType(resourceLocation)
|
val textures: MutableList<ResourceLocation> = mutableListOf()
|
||||||
|
data["render"]?.asJsonObject?.get("textures")?.asJsonArray?.let {
|
||||||
|
for (texture in it) {
|
||||||
|
val textureResourceLocation = ResourceLocation(texture.asString)
|
||||||
|
textures += Texture.getResourceTextureIdentifier(textureResourceLocation.namespace, textureName = "particle/${textureResourceLocation.path}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ParticleType(resourceLocation, textures.toList())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
|||||||
import de.bixilon.minosoft.protocol.packets.s2c.play.PositionAndRotationS2CP
|
import de.bixilon.minosoft.protocol.packets.s2c.play.PositionAndRotationS2CP
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.CountUpAndDownLatch
|
import de.bixilon.minosoft.util.CountUpAndDownLatch
|
||||||
import de.bixilon.minosoft.util.KUtil.synchronizedListOf
|
|
||||||
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
|
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
|
||||||
import de.bixilon.minosoft.util.Queue
|
import de.bixilon.minosoft.util.Queue
|
||||||
import de.bixilon.minosoft.util.Stopwatch
|
import de.bixilon.minosoft.util.Stopwatch
|
||||||
@ -79,7 +78,7 @@ class RenderWindow(
|
|||||||
private val screenshotTaker = ScreenshotTaker(this)
|
private val screenshotTaker = ScreenshotTaker(this)
|
||||||
val tintColorCalculator = TintColorCalculator(connection.world)
|
val tintColorCalculator = TintColorCalculator(connection.world)
|
||||||
val font = Font()
|
val font = Font()
|
||||||
val textures = TextureArray(synchronizedListOf())
|
val textures = TextureArray(synchronizedMapOf())
|
||||||
|
|
||||||
val rendererMap: MutableMap<ResourceLocation, Renderer> = synchronizedMapOf()
|
val rendererMap: MutableMap<ResourceLocation, Renderer> = synchronizedMapOf()
|
||||||
|
|
||||||
@ -200,16 +199,16 @@ class RenderWindow(
|
|||||||
|
|
||||||
|
|
||||||
Log.log(LogMessageType.RENDERING_LOADING) { "Generating font and gathering textures (${stopwatch.labTime()})..." }
|
Log.log(LogMessageType.RENDERING_LOADING) { "Generating font and gathering textures (${stopwatch.labTime()})..." }
|
||||||
textures.allTextures.add(Texture(RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION))
|
textures.allTextures.getOrPut(RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION) { Texture(RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION) }
|
||||||
WHITE_TEXTURE = TextureLikeTexture(
|
WHITE_TEXTURE = TextureLikeTexture(
|
||||||
texture = Texture(ResourceLocation("minosoft:textures/white.png")),
|
texture = Texture(ResourceLocation("minosoft:textures/white.png")),
|
||||||
uvStart = Vec2(0, 0),
|
uvStart = Vec2(0, 0),
|
||||||
uvEnd = Vec2(1.0f, 1.0f),
|
uvEnd = Vec2(1.0f, 1.0f),
|
||||||
size = Vec2i(16, 16)
|
size = Vec2i(16, 16)
|
||||||
)
|
)
|
||||||
textures.allTextures.add(WHITE_TEXTURE.texture)
|
textures.allTextures.getOrPut(WHITE_TEXTURE.texture.resourceLocation) { WHITE_TEXTURE.texture }
|
||||||
|
|
||||||
font.load(connection.assetsManager)
|
font.load(connection.assetsManager, textures.allTextures)
|
||||||
|
|
||||||
|
|
||||||
Log.log(LogMessageType.RENDERING_LOADING) { "Initializing renderer (${stopwatch.labTime()})..." }
|
Log.log(LogMessageType.RENDERING_LOADING) { "Initializing renderer (${stopwatch.labTime()})..." }
|
||||||
@ -219,7 +218,6 @@ class RenderWindow(
|
|||||||
|
|
||||||
|
|
||||||
Log.log(LogMessageType.RENDERING_LOADING) { "Preloading textures (${stopwatch.labTime()})..." }
|
Log.log(LogMessageType.RENDERING_LOADING) { "Preloading textures (${stopwatch.labTime()})..." }
|
||||||
font.preLoadAtlas(textures)
|
|
||||||
textures.preLoad(connection.assetsManager)
|
textures.preLoad(connection.assetsManager)
|
||||||
font.loadAtlas()
|
font.loadAtlas()
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ class WorldRenderer(
|
|||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
allBlocks = getAllBlocks(connection.version.registries)
|
allBlocks = getAllBlocks(connection.version.registries)
|
||||||
renderWindow.textures.allTextures.addAll(resolveBlockTextureIds(allBlocks!!))
|
resolveBlockTextureIds(allBlocks!!, renderWindow.textures.allTextures)
|
||||||
|
|
||||||
|
|
||||||
// register keybindings
|
// register keybindings
|
||||||
@ -210,16 +210,12 @@ class WorldRenderer(
|
|||||||
glDepthMask(true)
|
glDepthMask(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveBlockTextureIds(blocks: Collection<BlockState>): List<Texture> {
|
private fun resolveBlockTextureIds(blocks: Collection<BlockState>, textures: MutableMap<ResourceLocation, Texture>) {
|
||||||
val textures: MutableList<Texture> = mutableListOf()
|
|
||||||
val textureMap: MutableMap<String, Texture> = synchronizedMapOf()
|
|
||||||
|
|
||||||
for (block in blocks) {
|
for (block in blocks) {
|
||||||
for (model in block.renderers) {
|
for (model in block.renderers) {
|
||||||
model.resolveTextures(textures, textureMap)
|
model.resolveTextures(textures)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return textures
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.FaceSize
|
import de.bixilon.minosoft.gui.rendering.chunk.models.FaceSize
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
||||||
|
|
||||||
@ -9,23 +10,13 @@ interface BlockLikeRenderer {
|
|||||||
|
|
||||||
fun render(context: BlockLikeRenderContext)
|
fun render(context: BlockLikeRenderContext)
|
||||||
|
|
||||||
fun resolveTextures(indexed: MutableList<Texture>, textureMap: MutableMap<String, Texture>)
|
fun resolveTextures(textures: MutableMap<ResourceLocation, Texture>)
|
||||||
|
|
||||||
fun postInit() {}
|
fun postInit() {}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun resolveTexture(indexed: MutableList<Texture>, textureMap: MutableMap<String, Texture>, textureName: String): Texture? {
|
fun resolveTexture(textures: MutableMap<ResourceLocation, Texture>, textureResourceLocation: ResourceLocation): Texture {
|
||||||
var texture: Texture? = null
|
return textures.getOrPut(textureResourceLocation) { Texture(textureResourceLocation) }
|
||||||
val index: Int? = textureMap[textureName]?.let {
|
|
||||||
texture = it
|
|
||||||
indexed.indexOf(it)
|
|
||||||
}
|
|
||||||
if (index == null) {
|
|
||||||
texture = Texture(Texture.getResourceTextureIdentifier(textureName = textureName))
|
|
||||||
textureMap[textureName] = texture!!
|
|
||||||
indexed.add(texture!!)
|
|
||||||
}
|
|
||||||
return texture
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
|||||||
import com.google.common.collect.HashBiMap
|
import com.google.common.collect.HashBiMap
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import de.bixilon.minosoft.data.Directions
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.mappings.biomes.Biome
|
import de.bixilon.minosoft.data.mappings.biomes.Biome
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
@ -54,10 +55,10 @@ class BlockRenderer(data: JsonObject, parent: BlockModel) : BlockLikeRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveTextures(indexed: MutableList<Texture>, textureMap: MutableMap<String, Texture>) {
|
override fun resolveTextures(textures: MutableMap<ResourceLocation, Texture>) {
|
||||||
for ((key, textureName) in textures) {
|
for ((key, textureName) in this.textures) {
|
||||||
if (!textureName.startsWith("#")) {
|
if (!textureName.startsWith("#")) {
|
||||||
textureMapping[key] = BlockLikeRenderer.resolveTexture(indexed, textureMap, textureName = textureName)!!
|
textureMapping[key] = BlockLikeRenderer.resolveTexture(textures, textureResourceLocation = Texture.getResourceTextureIdentifier(textureName = textureName))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.Directions
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.mappings.biomes.Biome
|
import de.bixilon.minosoft.data.mappings.biomes.Biome
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
@ -221,9 +222,9 @@ class FluidRenderer(
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveTextures(indexed: MutableList<Texture>, textureMap: MutableMap<String, Texture>) {
|
override fun resolveTextures(textures: MutableMap<ResourceLocation, Texture>) {
|
||||||
stillTexture = BlockLikeRenderer.resolveTexture(indexed, textureMap, stillFluid.renderTexture.toString())!!
|
stillTexture = BlockLikeRenderer.resolveTexture(textures, Texture.getResourceTextureIdentifier(stillFluid.renderTexture!!.namespace, stillFluid.renderTexture.path))
|
||||||
flowingTexture = BlockLikeRenderer.resolveTexture(indexed, textureMap, flowingFluid.renderTexture.toString())!!
|
flowingTexture = BlockLikeRenderer.resolveTexture(textures, Texture.getResourceTextureIdentifier(flowingFluid.renderTexture!!.namespace, flowingFluid.renderTexture.path))
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.Directions
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.FaceSize
|
import de.bixilon.minosoft.gui.rendering.chunk.models.FaceSize
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
||||||
|
|
||||||
@ -45,9 +46,9 @@ class MultipartRenderer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveTextures(indexed: MutableList<Texture>, textureMap: MutableMap<String, Texture>) {
|
override fun resolveTextures(textures: MutableMap<ResourceLocation, Texture>) {
|
||||||
for (model in models) {
|
for (model in models) {
|
||||||
model.resolveTextures(indexed, textureMap)
|
model.resolveTextures(textures)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,16 +14,15 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.font
|
package de.bixilon.minosoft.gui.rendering.font
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.assets.AssetsManager
|
import de.bixilon.minosoft.data.assets.AssetsManager
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.TextureArray
|
|
||||||
|
|
||||||
class Font {
|
class Font {
|
||||||
lateinit var providers: List<FontProvider>
|
lateinit var providers: List<FontProvider>
|
||||||
private var preLoaded = false
|
|
||||||
private var loaded = false
|
private var loaded = false
|
||||||
|
|
||||||
fun load(assetsManager: AssetsManager) {
|
fun load(assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>) {
|
||||||
providers = FontLoader.loadFontProviders(assetsManager)
|
providers = FontLoader.loadFontProviders(assetsManager, textures)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getChar(char: Char): FontChar {
|
fun getChar(char: Char): FontChar {
|
||||||
@ -35,24 +34,8 @@ class Font {
|
|||||||
throw IllegalStateException("$char can not be rendered!")
|
throw IllegalStateException("$char can not be rendered!")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun preLoadAtlas(textureArray: TextureArray) {
|
|
||||||
check(!preLoaded) { "Font has already been preloaded!" }
|
|
||||||
|
|
||||||
val textures: MutableList<Texture> = mutableListOf()
|
|
||||||
for (provider in providers) {
|
|
||||||
for (atlasPage in provider.atlasTextures) {
|
|
||||||
textures.add(atlasPage)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
textureArray.allTextures.addAll(textures)
|
|
||||||
preLoaded = true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun loadAtlas() {
|
fun loadAtlas() {
|
||||||
check(!loaded) { "Font has already a atlas texture!" }
|
check(!loaded) { "Font has already a atlas texture!" }
|
||||||
check(preLoaded) { "Font hasn't been preloaded!" }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (provider in providers) {
|
for (provider in providers) {
|
||||||
for (char in provider.chars.values) {
|
for (char in provider.chars.values) {
|
||||||
|
@ -37,17 +37,17 @@ object FontLoader {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadBitmapFontProvider(atlasPath: ResourceLocation, height: Int? = 8, ascent: Int, chars: List<Char>, assetsManager: AssetsManager): FontProvider {
|
private fun loadBitmapFontProvider(atlasPath: ResourceLocation, height: Int? = 8, ascent: Int, chars: List<Char>, assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): FontProvider {
|
||||||
val width = if (ascent == 7) { // ToDo: Why?
|
val width = if (ascent == 7) { // ToDo: Why?
|
||||||
8
|
8
|
||||||
} else {
|
} else {
|
||||||
9
|
9
|
||||||
}
|
}
|
||||||
val provider = FontProvider(width)
|
val provider = FontProvider(width)
|
||||||
val atlasTexture = Texture((Texture.getResourceTextureIdentifier(atlasPath.namespace, atlasPath.path)))
|
val atlasResourceLocation = Texture.getResourceTextureIdentifier(atlasPath.namespace, atlasPath.path)
|
||||||
|
val atlasTexture = textures.getOrPut(atlasResourceLocation) { Texture(atlasResourceLocation) }
|
||||||
atlasTexture.load(assetsManager)
|
atlasTexture.load(assetsManager)
|
||||||
val height = height ?: atlasTexture.size.x / FONT_ATLAS_SIZE
|
val height = height ?: atlasTexture.size.x / FONT_ATLAS_SIZE
|
||||||
provider.atlasTextures.add(atlasTexture)
|
|
||||||
val charsCoordinates: MutableList<MutableList<FontChar>> = mutableListOf() // ToDo: Remove this
|
val charsCoordinates: MutableList<MutableList<FontChar>> = mutableListOf() // ToDo: Remove this
|
||||||
for ((i, char) in chars.withIndex()) {
|
for ((i, char) in chars.withIndex()) {
|
||||||
if (i % FONT_ATLAS_SIZE == 0) {
|
if (i % FONT_ATLAS_SIZE == 0) {
|
||||||
@ -89,21 +89,22 @@ object FontLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun loadUnicodeFontProvider(template: ResourceLocation, sizes: InputStream, assetsManager: AssetsManager): FontProvider {
|
private fun loadUnicodeFontProvider(template: ResourceLocation, sizes: InputStream, assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): FontProvider {
|
||||||
val provider = FontProvider(UNICODE_SIZE)
|
val provider = FontProvider(UNICODE_SIZE)
|
||||||
var i = 0
|
var i = 0
|
||||||
lateinit var currentAtlasTexture: Texture
|
lateinit var currentAtlasTexture: Texture
|
||||||
while (sizes.available() > 0) {
|
while (sizes.available() > 0) {
|
||||||
|
|
||||||
if (i % 256 == 0) {
|
if (i % 256 == 0) {
|
||||||
currentAtlasTexture = if (MISSING_UNICODE_PAGES.contains(i / UNICODE_CHARS_PER_PAGE)) {
|
val textureResourceLocation = if (MISSING_UNICODE_PAGES.contains(i / UNICODE_CHARS_PER_PAGE)) {
|
||||||
// ToDo: Why is this texture missing in minecraft?
|
// ToDo: Why is this texture missing in minecraft?
|
||||||
Texture(RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION)
|
RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION
|
||||||
} else {
|
} else {
|
||||||
// new page (texture)
|
// new page (texture)
|
||||||
Texture(Texture.getResourceTextureIdentifier(template.namespace, template.path.format("%02x".format(i / 256))))
|
Texture.getResourceTextureIdentifier(template.namespace, template.path.format("%02x".format(i / 256)))
|
||||||
}
|
}
|
||||||
|
currentAtlasTexture = textures.getOrPut(textureResourceLocation) { Texture(textureResourceLocation) }
|
||||||
currentAtlasTexture.load(assetsManager)
|
currentAtlasTexture.load(assetsManager)
|
||||||
provider.atlasTextures.add(currentAtlasTexture)
|
|
||||||
}
|
}
|
||||||
val sizeByte = sizes.read()
|
val sizeByte = sizes.read()
|
||||||
val fontChar = FontChar(currentAtlasTexture, (i % UNICODE_CHARS_PER_PAGE) / FONT_ATLAS_SIZE, (i % UNICODE_CHARS_PER_PAGE) % FONT_ATLAS_SIZE, (sizeByte shr 4) and 0x0F, (sizeByte and 0x0F) + 1, UNICODE_SIZE)
|
val fontChar = FontChar(currentAtlasTexture, (i % UNICODE_CHARS_PER_PAGE) / FONT_ATLAS_SIZE, (i % UNICODE_CHARS_PER_PAGE) % FONT_ATLAS_SIZE, (sizeByte shr 4) and 0x0F, (sizeByte and 0x0F) + 1, UNICODE_SIZE)
|
||||||
@ -113,13 +114,13 @@ object FontLoader {
|
|||||||
return provider
|
return provider
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadFontProvider(data: JsonObject, assetsManager: AssetsManager): FontProvider {
|
fun loadFontProvider(data: JsonObject, assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): FontProvider {
|
||||||
return when (data["type"].asString) {
|
return when (data["type"].asString) {
|
||||||
"bitmap" -> {
|
"bitmap" -> {
|
||||||
loadBitmapFontProvider(ResourceLocation(data["file"].asString), data["height"]?.asInt, data["ascent"].asInt, getCharArray(data["chars"].asJsonArray), assetsManager)
|
loadBitmapFontProvider(ResourceLocation(data["file"].asString), data["height"]?.asInt, data["ascent"].asInt, getCharArray(data["chars"].asJsonArray), assetsManager, textures)
|
||||||
}
|
}
|
||||||
"legacy_unicode" -> {
|
"legacy_unicode" -> {
|
||||||
loadUnicodeFontProvider(ResourceLocation(data["template"].asString), assetsManager.readAssetAsStream(ResourceLocation(data["sizes"].asString)), assetsManager)
|
loadUnicodeFontProvider(ResourceLocation(data["template"].asString), assetsManager.readAssetAsStream(ResourceLocation(data["sizes"].asString)), assetsManager, textures)
|
||||||
}
|
}
|
||||||
"ttf" -> {
|
"ttf" -> {
|
||||||
TODO("True Type Fonts are not implemented yet")
|
TODO("True Type Fonts are not implemented yet")
|
||||||
@ -129,10 +130,10 @@ object FontLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun loadFontProviders(assetsManager: AssetsManager): List<FontProvider> {
|
fun loadFontProviders(assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): List<FontProvider> {
|
||||||
val ret: MutableList<FontProvider> = mutableListOf()
|
val ret: MutableList<FontProvider> = mutableListOf()
|
||||||
for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).asJsonObject["providers"].asJsonArray) {
|
for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).asJsonObject["providers"].asJsonArray) {
|
||||||
val provider = loadFontProvider(providerElement.asJsonObject, assetsManager)
|
val provider = loadFontProvider(providerElement.asJsonObject, assetsManager, textures)
|
||||||
ret.add(provider)
|
ret.add(provider)
|
||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
|
@ -13,9 +13,8 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.font
|
package de.bixilon.minosoft.gui.rendering.font
|
||||||
|
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.Texture
|
class FontProvider(
|
||||||
|
val width: Int,
|
||||||
class FontProvider(val width: Int) {
|
) {
|
||||||
val chars: MutableMap<Char, FontChar> = mutableMapOf()
|
val chars: MutableMap<Char, FontChar> = mutableMapOf()
|
||||||
val atlasTextures: MutableList<Texture> = mutableListOf()
|
|
||||||
}
|
}
|
||||||
|
@ -57,10 +57,9 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
|
|||||||
override fun init() {
|
override fun init() {
|
||||||
hudShader.load(Minosoft.MINOSOFT_ASSETS_MANAGER)
|
hudShader.load(Minosoft.MINOSOFT_ASSETS_MANAGER)
|
||||||
|
|
||||||
val (hudTextures, hudAtlasElements) = HUDAtlasElement.deserialize(Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "mapping/atlas.json")).toResourceLocationMap())
|
this.hudAtlasElements = HUDAtlasElement.deserialize(Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "mapping/atlas.json")).toResourceLocationMap(), renderWindow.textures.allTextures)
|
||||||
this.hudAtlasElements = hudAtlasElements
|
|
||||||
|
|
||||||
renderWindow.textures.allTextures.addAll(hudTextures.toList())
|
|
||||||
|
|
||||||
registerDefaultElements()
|
registerDefaultElements()
|
||||||
|
|
||||||
|
@ -39,13 +39,12 @@ data class HUDAtlasElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun deserialize(json: Map<ResourceLocation, JsonObject>): Pair<Collection<Texture>, Map<ResourceLocation, HUDAtlasElement>> {
|
fun deserialize(json: Map<ResourceLocation, JsonObject>, textures: MutableMap<ResourceLocation, Texture>): Map<ResourceLocation, HUDAtlasElement> {
|
||||||
val textures: MutableMap<ResourceLocation, Texture> = mutableMapOf()
|
|
||||||
val ret: MutableMap<ResourceLocation, HUDAtlasElement> = mutableMapOf()
|
val ret: MutableMap<ResourceLocation, HUDAtlasElement> = mutableMapOf()
|
||||||
for ((resourceLocation, data) in json) {
|
for ((resourceLocation, data) in json) {
|
||||||
ret[resourceLocation] = deserialize(data, textures)
|
ret[resourceLocation] = deserialize(data, textures)
|
||||||
}
|
}
|
||||||
return Pair(textures.values, ret)
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
fun deserialize(json: JsonObject, textures: MutableMap<ResourceLocation, Texture>): HUDAtlasElement {
|
fun deserialize(json: JsonObject, textures: MutableMap<ResourceLocation, Texture>): HUDAtlasElement {
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.particle
|
package de.bixilon.minosoft.gui.rendering.particle
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.text.ChatColors
|
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
||||||
@ -37,14 +36,7 @@ class ParticleRenderer(
|
|||||||
private lateinit var particleShader: Shader
|
private lateinit var particleShader: Shader
|
||||||
private var particleMesh = ParticleMesh()
|
private var particleMesh = ParticleMesh()
|
||||||
|
|
||||||
private val texture = Texture(DUMMY_PARTICLE_RESOURCE_LOCATION)
|
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
particleMesh.load()
|
|
||||||
|
|
||||||
connection.registerEvent(CallbackEventInvoker.of<CameraMatrixChangeEvent> {
|
connection.registerEvent(CallbackEventInvoker.of<CameraMatrixChangeEvent> {
|
||||||
renderWindow.queue += {
|
renderWindow.queue += {
|
||||||
particleShader.use().setMat4("uViewProjectionMatrix", it.viewProjectionMatrix)
|
particleShader.use().setMat4("uViewProjectionMatrix", it.viewProjectionMatrix)
|
||||||
@ -52,7 +44,12 @@ class ParticleRenderer(
|
|||||||
particleShader.use().setVec3("uCameraUp", Vec3(it.viewMatrix[0][1], it.viewMatrix[1][1], it.viewMatrix[2][1]))
|
particleShader.use().setVec3("uCameraUp", Vec3(it.viewMatrix[0][1], it.viewMatrix[1][1], it.viewMatrix[2][1]))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
renderWindow.textures.allTextures += texture
|
particleMesh.load()
|
||||||
|
connection.registries.particleTypeRegistry.forEach {
|
||||||
|
for (resourceLocation in it.textures) {
|
||||||
|
renderWindow.textures.allTextures[resourceLocation] = Texture(resourceLocation)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun postInit() {
|
override fun postInit() {
|
||||||
@ -82,7 +79,7 @@ class ParticleRenderer(
|
|||||||
return min + random.nextFloat() * (max - min)
|
return min + random.nextFloat() * (max - min)
|
||||||
}
|
}
|
||||||
for (i in 0 until 123456) {
|
for (i in 0 until 123456) {
|
||||||
particleMesh.addVertex(Vec3(randomFlot(0.0f, 200.0f), randomFlot(6.0f, 200.0f), randomFlot(0.0f, 200.0f)), randomFlot(0.05f, 0.2f), texture, ChatColors.getRandomColor())
|
// particleMesh.addVertex(Vec3(randomFlot(0.0f, 200.0f), randomFlot(6.0f, 200.0f), randomFlot(0.0f, 200.0f)), randomFlot(0.05f, 0.2f), texture, ChatColors.getRandomColor())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -96,8 +93,6 @@ class ParticleRenderer(
|
|||||||
companion object : RendererBuilder<ParticleRenderer> {
|
companion object : RendererBuilder<ParticleRenderer> {
|
||||||
override val RESOURCE_LOCATION = ResourceLocation("minosoft:particle")
|
override val RESOURCE_LOCATION = ResourceLocation("minosoft:particle")
|
||||||
|
|
||||||
private val DUMMY_PARTICLE_RESOURCE_LOCATION = ResourceLocation("minecraft:textures/particle/spark_4.png")
|
|
||||||
|
|
||||||
|
|
||||||
override fun build(connection: PlayConnection, renderWindow: RenderWindow): ParticleRenderer {
|
override fun build(connection: PlayConnection, renderWindow: RenderWindow): ParticleRenderer {
|
||||||
return ParticleRenderer(connection, renderWindow)
|
return ParticleRenderer(connection, renderWindow)
|
||||||
|
@ -48,7 +48,7 @@ class SkyRenderer(
|
|||||||
)
|
)
|
||||||
private val skyboxMesh = SkyboxMesh()
|
private val skyboxMesh = SkyboxMesh()
|
||||||
private var skySunMesh = SimpleTextureMesh()
|
private var skySunMesh = SimpleTextureMesh()
|
||||||
private var sunTexture = Texture(SUN_TEXTURE_RESOURCE_LOCATION)
|
private lateinit var sunTexture: Texture
|
||||||
private var recalculateSunNextFrame: Boolean = true
|
private var recalculateSunNextFrame: Boolean = true
|
||||||
private var bottomColor = ChatColors.BLACK
|
private var bottomColor = ChatColors.BLACK
|
||||||
private var topColor = RenderConstants.DEFAULT_SKY_COLOR
|
private var topColor = RenderConstants.DEFAULT_SKY_COLOR
|
||||||
@ -74,7 +74,7 @@ class SkyRenderer(
|
|||||||
recalculateSunNextFrame = true
|
recalculateSunNextFrame = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
renderWindow.textures.allTextures.add(sunTexture)
|
sunTexture = renderWindow.textures.allTextures.getOrPut(SUN_TEXTURE_RESOURCE_LOCATION) { Texture(SUN_TEXTURE_RESOURCE_LOCATION) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setSunMatrix(projectionViewMatrix: Mat4) {
|
private fun setSunMatrix(projectionViewMatrix: Mat4) {
|
||||||
|
@ -30,14 +30,14 @@ import org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER
|
|||||||
import org.lwjgl.opengl.GL31.glBindBuffer
|
import org.lwjgl.opengl.GL31.glBindBuffer
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
class TextureArray(val allTextures: MutableList<Texture>) {
|
class TextureArray(val allTextures: MutableMap<ResourceLocation, Texture>) {
|
||||||
val animator = Animator()
|
val animator = Animator()
|
||||||
private var textureIds = Array(TEXTURE_RESOLUTION_ID_MAP.size) { -1 }
|
private var textureIds = Array(TEXTURE_RESOLUTION_ID_MAP.size) { -1 }
|
||||||
|
|
||||||
private val texturesByResolution = Array<MutableList<Texture>>(TEXTURE_RESOLUTION_ID_MAP.size) { mutableListOf() }
|
private val texturesByResolution = Array<MutableList<Texture>>(TEXTURE_RESOLUTION_ID_MAP.size) { mutableListOf() }
|
||||||
|
|
||||||
fun preLoad(assetsManager: AssetsManager?) {
|
fun preLoad(assetsManager: AssetsManager?) {
|
||||||
for (texture in allTextures) {
|
for (texture in allTextures.values) {
|
||||||
if (!texture.isLoaded) {
|
if (!texture.isLoaded) {
|
||||||
texture.load(assetsManager!!)
|
texture.load(assetsManager!!)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user