diff --git a/build.gradle.kts b/build.gradle.kts index 49717f2..570a3ef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,11 @@ dependencies { minecraft("com.mojang", "minecraft", project.extra["minecraft_version"] as String) mappings("net.fabricmc", "yarn", project.extra["yarn_mappings"] as String, null, "v2") modImplementation("net.fabricmc", "fabric-loader", project.extra["loader_version"] as String) - modImplementation("net.fabricmc.fabric-api", "fabric-api", project.extra["fabric_version"] as String) + modImplementation( + "net.fabricmc.fabric-api", + "fabric-api", + project.extra["fabric_version"] as String + ) modImplementation( "net.fabricmc", "fabric-language-kotlin", @@ -36,6 +40,27 @@ rustImport { layout.set("flat") } +val mainSourceSet = sourceSets.main.get() + +val datagenDir = layout.projectDirectory.dir("src").dir(mainSourceSet.name).dir("generated") +loom { + runs { + create("datagenClient") { + inherit(runConfigs["client"]) + name("Data Generation") + vmArg("-Dfabric-api.datagen") + vmArg("-Dfabric-api.datagen.output-dir=$datagenDir") + vmArg("-Dfabric-api.datagen.modid=dawd3") + ideConfigGenerated(true) + runDir("build/datagen") + } + } +} + +sourceSets.named(mainSourceSet.name) { + resources.srcDir(datagenDir) +} + tasks { val javaVersion = JavaVersion.toVersion((project.extra["java_version"] as String).toInt()) diff --git a/d3r/Cargo.lock b/d3r/Cargo.lock index e3f902d..0b73e36 100644 --- a/d3r/Cargo.lock +++ b/d3r/Cargo.lock @@ -220,6 +220,7 @@ dependencies = [ "bitvec", "cpal", "env_logger", + "hound", "jni 0.20.0", "log", ] @@ -264,6 +265,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hound" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" + [[package]] name = "humantime" version = "2.1.0" diff --git a/d3r/Cargo.toml b/d3r/Cargo.toml index f1efdf0..52ea656 100644 --- a/d3r/Cargo.toml +++ b/d3r/Cargo.toml @@ -12,5 +12,6 @@ crate-type = ["cdylib"] bitvec = "1.0.1" cpal = "0.14.1" env_logger = "0.9.3" +hound = "3.5.0" jni = "0.20.0" log = "0.4.17" diff --git a/d3r/src/lib.rs b/d3r/src/lib.rs index 013f8c1..eccdce1 100644 --- a/d3r/src/lib.rs +++ b/d3r/src/lib.rs @@ -1,8 +1,10 @@ use std::cell::RefCell; use std::fmt::Display; +use std::fs::File; use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; use cpal::{BufferSize, Device, Host, SampleRate, Stream, StreamConfig}; +use hound::{SampleFormat, WavSpec}; use jni::objects::{JClass, JMethodID, JObject}; use jni::signature::ReturnType; use jni::sys::jvalue; @@ -157,6 +159,7 @@ pub extern "system" fn Java_net_liquidev_d3r_D3r_openOutputStream( let generator_ref = env.new_global_ref(generator).map_err(|e| e.to_string())?; let jvm = env.get_java_vm().map_err(|e| e.to_string())?; let mut initialized = false; + let stream = device .build_output_stream( &config.clone(), diff --git a/proj/block/module_generic.ase b/proj/block/module_generic.ase deleted file mode 100644 index 69f032a..0000000 Binary files a/proj/block/module_generic.ase and /dev/null differ diff --git a/proj/block/speaker_front.ase b/proj/block/speaker_front.ase index a09f132..198b27d 100644 Binary files a/proj/block/speaker_front.ase and b/proj/block/speaker_front.ase differ diff --git a/proj/block/speaker_side.ase b/proj/block/speaker_side.ase new file mode 100644 index 0000000..c5b0faa Binary files /dev/null and b/proj/block/speaker_side.ase differ diff --git a/proj/device/port.ase b/proj/device/port.ase new file mode 100644 index 0000000..a369e1b Binary files /dev/null and b/proj/device/port.ase differ diff --git a/src/main/generated/.cache/f3798f81c7b6fecad2cbfec741314f8a66c0eca3 b/src/main/generated/.cache/f3798f81c7b6fecad2cbfec741314f8a66c0eca3 new file mode 100644 index 0000000..23be6be --- /dev/null +++ b/src/main/generated/.cache/f3798f81c7b6fecad2cbfec741314f8a66c0eca3 @@ -0,0 +1,4 @@ +// 1.19.2 2022-11-20T23:04:16.520652716 Models +e3c6aacd49a6395f37047d3df31f91a18a411267 assets/dawd3/models/item/speaker.json +f7b47538f17992177e97e06842c0039ae5096b2b assets/dawd3/blockstates/speaker.json +bd0adfc8b3dc271042dd4b19a8cace4e0fffedfe assets/dawd3/models/block/speaker.json diff --git a/src/main/generated/assets/dawd3/blockstates/speaker.json b/src/main/generated/assets/dawd3/blockstates/speaker.json new file mode 100644 index 0000000..c4792b6 --- /dev/null +++ b/src/main/generated/assets/dawd3/blockstates/speaker.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "dawd3:block/speaker", + "y": 90 + }, + "facing=north": { + "model": "dawd3:block/speaker" + }, + "facing=south": { + "model": "dawd3:block/speaker", + "y": 180 + }, + "facing=west": { + "model": "dawd3:block/speaker", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/dawd3/models/block/speaker.json b/src/main/generated/assets/dawd3/models/block/speaker.json new file mode 100644 index 0000000..a240d95 --- /dev/null +++ b/src/main/generated/assets/dawd3/models/block/speaker.json @@ -0,0 +1,73 @@ +{ + "parent": "block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#side" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#front" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#side" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0.0, + 0.0, + 0.0 + ], + "to": [ + 16.0, + 16.0, + 16.0 + ] + }, + { + "faces": { + "south": { + "cullface": "south", + "texture": "#port", + "uv": [ + 0.0, + 0.0, + 4.0, + 4.0 + ] + } + }, + "from": [ + 6.5, + 6.5, + 15.99 + ], + "to": [ + 9.5, + 9.5, + 16.01 + ] + } + ], + "textures": { + "front": "dawd3:block/speaker_front", + "particle": "#side", + "port": "dawd3:device/port", + "side": "dawd3:block/speaker_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/dawd3/models/item/speaker.json b/src/main/generated/assets/dawd3/models/item/speaker.json similarity index 100% rename from src/main/resources/assets/dawd3/models/item/speaker.json rename to src/main/generated/assets/dawd3/models/item/speaker.json diff --git a/src/main/java/net/liquidev/d3r/AudioOutputStream.java b/src/main/java/net/liquidev/d3r/AudioOutputStream.java index 2dfe1ee..7daa098 100644 --- a/src/main/java/net/liquidev/d3r/AudioOutputStream.java +++ b/src/main/java/net/liquidev/d3r/AudioOutputStream.java @@ -1,7 +1,7 @@ package net.liquidev.d3r; public interface AudioOutputStream { - float[] getOutputBuffer(int sampleCount, int channels); + float[] getOutputBuffer(int sampleCount, int channelCount); void error(String message); } diff --git a/src/main/java/net/liquidev/d3r/D3r.java b/src/main/java/net/liquidev/d3r/D3r.java index 050fb87..38a6dff 100644 --- a/src/main/java/net/liquidev/d3r/D3r.java +++ b/src/main/java/net/liquidev/d3r/D3r.java @@ -9,7 +9,7 @@ import java.nio.file.Path; import java.util.Comparator; public class D3r { - private static final Logger LOGGER = LoggerFactory.getLogger("dawd³/d3r"); + private static final Logger LOGGER = LoggerFactory.getLogger("dawd3/d3r"); private static Path tempDir = null; public static void load() throws D3rException, IOException { diff --git a/src/main/kotlin/net/liquidev/dawd3/D3Registry.kt b/src/main/kotlin/net/liquidev/dawd3/D3Registry.kt index 7f568c7..d1f4c68 100644 --- a/src/main/kotlin/net/liquidev/dawd3/D3Registry.kt +++ b/src/main/kotlin/net/liquidev/dawd3/D3Registry.kt @@ -7,8 +7,8 @@ abstract class D3Registry { var registered = arrayListOf>() - fun add(id: String, item: T): Registered { - val entry = Registered(Identifier(Mod.id, id), item) + fun add(id: Identifier, item: T): Registered { + val entry = Registered(id, item) registered.add(entry) return entry } diff --git a/src/main/kotlin/net/liquidev/dawd3/Mod.kt b/src/main/kotlin/net/liquidev/dawd3/Mod.kt index ed95be5..f8763e2 100644 --- a/src/main/kotlin/net/liquidev/dawd3/Mod.kt +++ b/src/main/kotlin/net/liquidev/dawd3/Mod.kt @@ -4,33 +4,45 @@ import net.fabricmc.api.ClientModInitializer import net.fabricmc.api.ModInitializer import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents import net.liquidev.d3r.D3r +import net.liquidev.dawd3.audio.Audio import net.liquidev.dawd3.block.Blocks +import net.liquidev.dawd3.block.entity.registerBlockEntityEvents import net.liquidev.dawd3.item.Items -import net.liquidev.dawd3.sound.Sound +import org.slf4j.Logger import org.slf4j.LoggerFactory @Suppress("UNUSED") object Mod : ModInitializer, ClientModInitializer { const val id = "dawd3" - private val logger = LoggerFactory.getLogger("dawd³") + val logger = logger(null) override fun onInitialize() { logger.info("hello, sound traveler! welcome to the dawd³ experience") - - Blocks.blockRegistry.registerAll() + Blocks.initialize() Items.registry.registerAll() } override fun onInitializeClient() { logger.info("booting up sound engine") D3r.load() - Sound.forceInitializationNow() + Audio.forceInitializationNow() ClientLifecycleEvents.CLIENT_STOPPING.register { logger.info("shutting down sound engine") - Sound.deinitialize() + Audio.deinitialize() D3r.unload() } + + registerBlockEntityEvents() } + + private fun loggerName(name: String?): String = + if (name != null) "$id/$name" else id + + fun logger(name: String?): Logger = + LoggerFactory.getLogger(loggerName(name)) + + inline fun logger(): Logger = + logger(T::class.simpleName) } diff --git a/src/main/kotlin/net/liquidev/dawd3/audio/Audio.kt b/src/main/kotlin/net/liquidev/dawd3/audio/Audio.kt new file mode 100644 index 0000000..89d52ab --- /dev/null +++ b/src/main/kotlin/net/liquidev/dawd3/audio/Audio.kt @@ -0,0 +1,37 @@ +package net.liquidev.dawd3.audio + +import net.liquidev.d3r.D3r +import net.liquidev.dawd3.Mod +import net.liquidev.dawd3.audio.generator.MixGenerator +import net.liquidev.dawd3.audio.unit.Decibels + +/** Audio system and common settings. */ +object Audio { + val logger = Mod.logger