diff --git a/.factorypath b/.factorypath new file mode 100644 index 0000000..4ae3163 --- /dev/null +++ b/.factorypath @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a55a9b9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Disable autocrlf on generated files, they always generate with LF +# Add any extra files or paths here to make git stop saying they +# are changed when only line endings change. +src/generated/**/.cache/cache text eol=lf +src/generated/**/*.json text eol=lf + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..d6178b7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,47 @@ +name: Build JAR + +on: + workflow_dispatch: + push: + branches: + - 'main' + paths: + - 'build.gradle' + pull_request: + branches: + - 'main' + paths: + - 'src/**' + - '*.gradle' + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + + - name: Checkout Repository + uses: actions/checkout@master + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '8' + + - name: Gradle Build + run: ./gradlew build + + - name: Upload Build Artifact + uses: actions/upload-artifact@v2 + with: + name: Generated JAR + path: build/libs/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..2d296be --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,47 @@ +name: Publish + +on: + push: + tags: + - '*' + +jobs: + publish: + runs-on: ubuntu-20.04 + steps: + + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '8' + + - name: Build + run: ./gradlew build + + - name: Publish to Modrinth + run: ./gradlew publishModrinth + env: + MODRINTH: ${{ secrets.MODRINTH_TOKEN }} + + - name: Publish to Curseforge + run: ./gradlew curseforge + env: + CURSEFORGE: ${{ secrets.CURSEFORGE_TOKEN }} + + - name: Publish to Infernal Studios Maven + run: ./gradlew publish + env: + MAVEN_USER: ${{ secrete.MAVEN_USER }} + MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} + + - name: Create GitHub Release + uses: ncipollo/release-action@v1 + with: + artifacts: "./build/libs/*" + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a83b872 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +bin +*.launch +.settings +.metadata +.classpath +.project +out +*.ipr +*.iws +*.iml +.idea +build +.gradle +eclipse +run +logs + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b09cd78 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..17b50d5 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Ocean Worlds + Ocean Worlds diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3389d8c --- /dev/null +++ b/build.gradle @@ -0,0 +1,188 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://plugins.gradle.org/m2/' } + mavenCentral() + } + + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath group: 'gradle.plugin.com.modrinth.minotaur', name: 'Minotaur', version: '1.2.1' + classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: '1.4.0' + classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7+' + } +} +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'eclipse' +apply plugin: 'maven-publish' +apply plugin: 'org.spongepowered.mixin' +apply plugin: 'com.matthewprenger.cursegradle' + +ext.config = parseConfig(file('build.properties')) + +version = config.VERSION +group = "${config.GROUP}.${config.ARTIFACT}" +archivesBaseName = "${config.ARCHIVES_BASE_NAME}-${config.MINECRAFT_VERSION}" + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +minecraft { + mappings channel: config.MAPPINGS_CHANNEL, version: config.MAPPINGS_VERSION + + runs { + client { + workingDirectory project.file('run') +// property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + mods { + oceanworlds { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') +// property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + mods { + oceanworlds { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') +// property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + args '--mod', config.MOD_ID, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + mods { + oceanworlds { + source sourceSets.main + } + } + } + } +} + +repositories { + +} + +dependencies { + minecraft "net.minecraftforge:forge:${config.MINECRAFT_VERSION}-${config.FORGE_VERSION}" + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' +} + +jar { + manifest { + attributes([ + 'Specification-Title' : config.TITLE, + 'Specification-Vendor' : config.AUTHOR, + 'Specification-Version' : '1', + 'Implementation-Title' : config.TITLE, + 'Implementation-Version': config.VERSION, + 'Implementation-Vendor' : config.AUTHOR + ]) + } +} + +mixin { + add sourceSets.main, 'oceanworlds.refmap.json' + config 'oceanworlds.mixins.json' +} + +jar.finalizedBy('reobfJar') + +publishing { + publications { + mavenJava(MavenPublication) { + groupId = config.GROUP + artifactId = config.ARTIFACT + artifact jar + + pom { + name = config.NAME + url = config.URL + licenses { + license { + name = config.LICENSE_NAME + url = config.LICENSE_URL + } + } + scm { + connection = config.SCM_CONNECTION + url = config.SCM_URL + } + } + } + } + + repositories { + maven { + url config.MAVEN_URL + + + credentials { + username = System.getenv('MAVEN_USER') + password = System.getenv('MAVEN_TOKEN') + } + + authentication { + basic(BasicAuthentication) + } + } + } +} + +task publishModrinth() { + println('Modrinth publishing is not setup yet!') +} + +tasks.curseforge.configure { + actions.clear() + doLast { + println('Modrinth publishing is not setup yet!') + } +} + +// // Modrinth publishing +// import com.modrinth.minotaur.TaskModrinthUpload + +// task publishModrinth (type: TaskModrinthUpload) { +// onlyIf { +// System.getenv('MODRINTH') +// } + +// token = System.getenv('MODRINTH') +// projectId = config.MODRINTH_ID +// versionNumber = project.version +// uploadFile = jar +// addGameVersion(config.MINECRAFT_VERSION) +// addLoader('forge') +// } + +// // Curseforge publishing +// curseforge { +// apiKey = System.getenv('CURSEFORGE') ?: 'If you\'re seeing this, you haven\'t set your "CURSEFORGE" environment variable' + +// project { +// id = config.CURSEFORGE_ID +// changelog = 'No changelog specified.' +// releaseType = 'release' +// addGameVersion config.MINECRAFT_VERSION +// mainArtifact (jar) { +// displayName = "${project.version}" +// } +// } +// } + +// Config parse function +def parseConfig(File config) { + config.withReader { + def prop = new Properties() + prop.load(it) + return new ConfigSlurper().parse(prop) + } +} diff --git a/build.properties b/build.properties new file mode 100644 index 0000000..55ead8b --- /dev/null +++ b/build.properties @@ -0,0 +1,29 @@ +VERSION=1.1.0 + +MINECRAFT_VERSION=1.19.2 + +FORGE_VERSION=43.3.5 + +MAPPINGS_CHANNEL=official +MAPPINGS_VERSION=1.19.2 + +GROUP=org.infernalstudios +ARTIFACT=oceanworlds +MOD_ID=oceanworlds +ARCHIVES_BASE_NAME=oceanworlds +TITLE=oceanworlds +AUTHOR=Infernal Studios + +## Publishing information +## Modify this before publishing!! + +NAME=Ocean Worlds +URL=https://infernalstudios.org/oceanworlds +LICENSE_NAME=Apache License 2.0 +LICENSE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt +SCM_CONNECTION=scm:git:git://github.com/infernalexp/Ocean-Worlds.git +SCM_URL=https://github.com/infernalexp/Ocean-Worlds.git +MAVEN_URL=https://maven.infernalstudios.org/ + +#MODRINTH_ID=NotARealId +#CURSEFORGE_ID=696969 diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..878bf1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7454180 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e750102 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..c53aefa --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/org/infernalstudios/oceanworlds/OceanWorlds.java b/src/main/java/org/infernalstudios/oceanworlds/OceanWorlds.java new file mode 100644 index 0000000..e792002 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/OceanWorlds.java @@ -0,0 +1,62 @@ +/** + * Copyright 2022 Infernal Studios + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.infernalstudios.oceanworlds; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.infernalstudios.oceanworlds.block.FullWaterBlock; +import org.infernalstudios.oceanworlds.block.NonFlowingLiquidBlock; +import org.infernalstudios.oceanworlds.config.OceanWorldsOptions; + +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +@Mod("oceanworlds") +public class OceanWorlds { + + public static final String NAME = "Ocean Worlds"; + public static final String MOD_ID = "oceanworlds"; + public static final Logger LOGGER = LogManager.getLogger(NAME); + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID); + public static final RegistryObject FALSE_WATER = BLOCKS.register("false_water", + () -> new NonFlowingLiquidBlock(() -> Fluids.WATER, BlockBehaviour.Properties.of(Material.WATER).noCollission().strength(100.0F).noLootTable(), Blocks.WATER)); + public static final RegistryObject FALSE_LAVA = BLOCKS.register("false_lava", () -> new NonFlowingLiquidBlock(() -> Fluids.LAVA, + BlockBehaviour.Properties.of(Material.LAVA).noCollission().randomTicks().strength(100.0F).lightLevel((p_50755_) -> 15).noLootTable(), Blocks.LAVA)); + public static final RegistryObject FULL_WATER = BLOCKS.register("full_water", + () -> new FullWaterBlock(() -> Fluids.WATER, BlockBehaviour.Properties.of(Material.WATER).noCollission().strength(100.0F).noLootTable(), Blocks.WATER)); + + public OceanWorlds() { + OceanWorldsOptions.init(); + + for (DyeColor dye : DyeColor.values()) { + BLOCKS.register(dye.getName() + "_false_water", + () -> new NonFlowingLiquidBlock(() -> Fluids.WATER, BlockBehaviour.Properties.of(Material.WATER).noCollission().strength(100.0F).noLootTable(), Blocks.WATER)); + BLOCKS.register(dye.getName() + "_full_water", + () -> new FullWaterBlock(() -> Fluids.WATER, BlockBehaviour.Properties.of(Material.WATER).noCollission().strength(100.0F).noLootTable(), Blocks.WATER)); + } + + BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/block/FullWaterBlock.java b/src/main/java/org/infernalstudios/oceanworlds/block/FullWaterBlock.java new file mode 100644 index 0000000..317ff7b --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/block/FullWaterBlock.java @@ -0,0 +1,27 @@ +package org.infernalstudios.oceanworlds.block; + +import java.util.function.Supplier; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class FullWaterBlock extends NonFlowingLiquidBlock { + + public FullWaterBlock(Supplier p_54694_, Properties p_54695_, Block fallback) { + super(p_54694_, p_54695_, fallback); + } + + @Override + public VoxelShape getCollisionShape(BlockState p_54760_, BlockGetter p_54761_, BlockPos p_54762_, CollisionContext p_54763_) { + return Block.box(0.0, 0.0, 0.0, 1.0, + p_54760_.getValue(LiquidBlock.LEVEL) > 7 ? 1.0F : p_54760_.getValue(LiquidBlock.LEVEL) == 0 ? 1.0F : (Mth.abs(p_54760_.getValue(LiquidBlock.LEVEL) - 7) / 6.0F), 1.0); + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/block/NonFlowingLiquidBlock.java b/src/main/java/org/infernalstudios/oceanworlds/block/NonFlowingLiquidBlock.java new file mode 100644 index 0000000..eddb046 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/block/NonFlowingLiquidBlock.java @@ -0,0 +1,40 @@ +package org.infernalstudios.oceanworlds.block; + +import java.util.function.Supplier; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; + +public class NonFlowingLiquidBlock extends LiquidBlock { + + private final Block fallback; + + public NonFlowingLiquidBlock(Supplier p_54694_, Properties p_54695_, Block fallback) { + super(p_54694_, p_54695_); + this.fallback = fallback; + } + + @Override + public void onPlace(BlockState p_54754_, Level p_54755_, BlockPos p_54756_, BlockState p_54757_, boolean p_54758_) { + } + + @Override + public BlockState updateShape(BlockState p_54723_, Direction p_54724_, BlockState p_54725_, LevelAccessor p_54726_, BlockPos p_54727_, BlockPos p_54728_) { + /* + * return p_54726_.getBlockState(p_54728_).is(fallback) ? + * fallback.withPropertiesOf(p_54723_) : p_54723_; + */ + return p_54723_; + } + + @Override + public void neighborChanged(BlockState p_54709_, Level p_54710_, BlockPos p_54711_, Block p_54712_, BlockPos p_54713_, boolean p_54714_) { + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/config/FastNoiseSampler.java b/src/main/java/org/infernalstudios/oceanworlds/config/FastNoiseSampler.java new file mode 100644 index 0000000..cd723c8 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/config/FastNoiseSampler.java @@ -0,0 +1,2565 @@ +package org.infernalstudios.oceanworlds.config; + +import net.minecraft.util.StringRepresentable; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; + +//MIT License +// +//Copyright(c) 2020 Jordan Peck (jordan.me2@gmail.com) +//Copyright(c) 2020 Contributors +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files(the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions : +// +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +public class FastNoiseSampler { + + private final GeneralSettings generalSettings; + private final FractalSettings fractalSettings; + private final CellularSettings cellularSettings; + private final DomainWarpSettings domainWarpSettings; + private final DomainWarpFractalSettings domainWarpFractalSettings; + + public FastNoiseSampler(GeneralSettings generalSettings, FractalSettings fractalSettings, CellularSettings cellularSettings, DomainWarpSettings domainWarpSettings, + DomainWarpFractalSettings domainWarpFractalSettings) { + this.generalSettings = generalSettings; + this.fractalSettings = fractalSettings; + this.cellularSettings = cellularSettings; + this.domainWarpSettings = domainWarpSettings; + this.domainWarpFractalSettings = domainWarpFractalSettings; + } + + public GeneralSettings getGeneralSettings() { + return generalSettings; + } + + public FractalSettings getFractalSettings() { + return fractalSettings; + } + + public CellularSettings getCellularSettings() { + return cellularSettings; + } + + public DomainWarpSettings getDomainWarpSettings() { + return domainWarpSettings; + } + + public DomainWarpFractalSettings getDomainWarpFractalSettings() { + return domainWarpFractalSettings; + } + + public double GetNoise(double x, double y, long worldSeed) { + + Vector2 vector = new Vector2(x, y); + DomainWarp(vector, worldSeed + generalSettings.seedOffset); + x = vector.x; + y = vector.y; + + x *= generalSettings.frequency; + y *= generalSettings.frequency; + + switch (generalSettings.noiseType) { + case OpenSimplex2: + case OpenSimplex2S: { + final double SQRT3 = (double) 1.7320508075688772935274463415059; + final double F2 = 0.5d * (SQRT3 - 1); + double t = (x + y) * F2; + x += t; + y += t; + } + break; + default: + break; + } + + switch (fractalSettings.fractalType) { + default: + return generalSettings.invert ? -GenNoiseSingle(worldSeed + generalSettings.seedOffset, x, y) : GenNoiseSingle(worldSeed + generalSettings.seedOffset, x, y); + case FBm: + return generalSettings.invert ? -GenFractalFBm(x, y, worldSeed + generalSettings.seedOffset) : GenFractalFBm(x, y, worldSeed + generalSettings.seedOffset); + case Ridged: + return generalSettings.invert ? -GenFractalRidged(x, y, worldSeed + generalSettings.seedOffset) : GenFractalRidged(x, y, worldSeed + generalSettings.seedOffset); + case PingPong: + return generalSettings.invert ? -GenFractalPingPong(x, y, worldSeed + generalSettings.seedOffset) : GenFractalPingPong(x, y, worldSeed + generalSettings.seedOffset); + } + } + + public double GetNoise(double x, double y, double z, long worldSeed) { + + Vector3 vector = new Vector3(x, y, z); + DomainWarp(vector, worldSeed + generalSettings.seedOffset); + x = vector.x; + y = vector.y; + z = vector.z; + + x *= generalSettings.frequency; + y *= generalSettings.frequency; + z *= generalSettings.frequency; + + switch (generalSettings.transformTypeType3D) { + case ImproveXYPlanes: { + double xy = x + y; + double s2 = xy * -(double) 0.211324865405187; + z *= (double) 0.577350269189626; + x += s2 - z; + y = y + s2 - z; + z += xy * (double) 0.577350269189626; + } + break; + case ImproveXZPlanes: { + double xz = x + z; + double s2 = xz * -(double) 0.211324865405187; + y *= (double) 0.577350269189626; + x += s2 - y; + z += s2 - y; + y += xz * (double) 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + final double R3 = (double) (2.0 / 3.0); + double r = (x + y + z) * R3; + x = r - x; + y = r - y; + z = r - z; + } + break; + default: + break; + } + + switch (fractalSettings.fractalType) { + default: + return generalSettings.invert ? -GenNoiseSingle(worldSeed + generalSettings.seedOffset, x, y, z) : GenNoiseSingle(worldSeed + generalSettings.seedOffset, x, y, z); + case FBm: + return generalSettings.invert ? -GenFractalFBm(x, y, z, worldSeed + generalSettings.seedOffset) : GenFractalFBm(x, y, z, worldSeed + generalSettings.seedOffset); + case Ridged: + return generalSettings.invert ? -GenFractalRidged(x, y, z, worldSeed + generalSettings.seedOffset) : GenFractalRidged(x, y, z, worldSeed + generalSettings.seedOffset); + case PingPong: + return generalSettings.invert ? -GenFractalPingPong(x, y, z, worldSeed + generalSettings.seedOffset) : GenFractalPingPong(x, y, z, worldSeed + generalSettings.seedOffset); + } + } + + public void DomainWarp(Vector2 coord, long worldSeed) { + DomainWarpSingle(coord, worldSeed); + switch (domainWarpFractalSettings.domainWarpFractalType) { + case DomainWarpProgressive: + DomainWarpFractalProgressive(coord, worldSeed); + break; + case DomainWarpIndependent: + DomainWarpFractalIndependent(coord, worldSeed); + break; + case None: + break; + } + } + + public void DomainWarp(Vector3 coord, long worldSeed) { + DomainWarpSingle(coord, worldSeed); + switch (domainWarpFractalSettings.domainWarpFractalType) { + case DomainWarpProgressive: + DomainWarpFractalProgressive(coord, worldSeed); + break; + case DomainWarpIndependent: + DomainWarpFractalIndependent(coord, worldSeed); + break; + case None: + break; + } + } + + private static double FastMin(double a, double b) { + return a < b ? a : b; + } + + private static double FastMax(double a, double b) { + return a > b ? a : b; + } + + private static double FastAbs(double f) { + return f < 0 ? -f : f; + } + + private static double FastSqrt(double f) { + return (double) Math.sqrt(f); + } + + private static int FastFloor(double f) { + return f >= 0 ? (int) f : (int) f - 1; + } + + private static int FastRound(double f) { + return f >= 0 ? (int) (f + 0.5d) : (int) (f - 0.5d); + } + + private static double Lerp(double a, double b, double t) { + return a + t * (b - a); + } + + private static double InterpHermite(double t) { + return t * t * (3 - 2 * t); + } + + private static double InterpQuintic(double t) { + return t * t * t * (t * (t * 6 - 15) + 10); + } + + private static double CubicLerp(double a, double b, double c, double d, double t) { + double p = (d - c) - (a - b); + return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; + } + + private static double PingPong(double t) { + t -= (int) (t * 0.5d) * 2; + return t < 1 ? t : 2 - t; + } + + private static int Hash(long seed, int xPrimed, int yPrimed) { + int hash = Long.hashCode(seed) ^ xPrimed ^ yPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static int Hash(long seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = Long.hashCode(seed) ^ xPrimed ^ yPrimed ^ zPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static double ValCoord(long seed, int xPrimed, int yPrimed) { + int hash = Hash(seed, xPrimed, yPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0d); + } + + private static double ValCoord(long seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0d); + } + + private static double GradCoord(long seed, int xPrimed, int yPrimed, double xd, double yd) { + int hash = Hash(seed, xPrimed, yPrimed); + hash ^= hash >> 15; + hash &= 127 << 1; + + double xg = Gradients2D[hash]; + double yg = Gradients2D[hash | 1]; + + return xd * xg + yd * yg; + } + + private static double GradCoord(long seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + hash ^= hash >> 15; + hash &= 63 << 2; + + double xg = Gradients3D[hash]; + double yg = Gradients3D[hash | 1]; + double zg = Gradients3D[hash | 2]; + + return xd * xg + yd * yg + zd * zg; + } + + private double GenNoiseSingle(long seed, double x, double y) { + switch (generalSettings.noiseType) { + case OpenSimplex2: + return SingleSimplex(seed, x, y); + case OpenSimplex2S: + return SingleOpenSimplex2S(seed, x, y); + case Cellular: + return SingleCellular(seed, x, y); + case Perlin: + return SinglePerlin(seed, x, y); + case ValueCubic: + return SingleValueCubic(seed, x, y); + case Value: + return SingleValue(seed, x, y); + default: + return 0; + } + } + + private double GenNoiseSingle(long seed, double x, double y, double z) { + switch (generalSettings.noiseType) { + case OpenSimplex2: + return SingleOpenSimplex2(seed, x, y, z); + case OpenSimplex2S: + return SingleOpenSimplex2S(seed, x, y, z); + case Cellular: + return SingleCellular(seed, x, y, z); + case Perlin: + return SinglePerlin(seed, x, y, z); + case ValueCubic: + return SingleValueCubic(seed, x, y, z); + case Value: + return SingleValue(seed, x, y, z); + default: + return 0; + } + } + + private double GenFractalFBm(double x, double y, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = GenNoiseSingle(seed++, x, y); + sum += noise * amp; + amp *= Lerp(1.0d, FastMin(noise + 1, 2) * 0.5d, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double GenFractalFBm(double x, double y, double z, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = GenNoiseSingle(seed++, x, y, z); + sum += noise * amp; + amp *= Lerp(1.0d, (noise + 1) * 0.5d, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + z *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double GenFractalRidged(double x, double y, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = FastAbs(GenNoiseSingle(seed++, x, y)); + sum += (noise * -2 + 1) * amp; + amp *= Lerp(1.0d, 1 - noise, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double GenFractalRidged(double x, double y, double z, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = FastAbs(GenNoiseSingle(seed++, x, y, z)); + sum += (noise * -2 + 1) * amp; + amp *= Lerp(1.0d, 1 - noise, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + z *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double GenFractalPingPong(double x, double y, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = PingPong((GenNoiseSingle(seed++, x, y) + 1) * fractalSettings.pingPongStrength); + sum += (noise - 0.5d) * 2 * amp; + amp *= Lerp(1.0d, noise, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double GenFractalPingPong(double x, double y, double z, long worldSeed) { + long seed = worldSeed; + double sum = 0; + double amp = fractalSettings.fractalBounding; + + for (int i = 0; i < fractalSettings.octaves; i++) { + double noise = PingPong((GenNoiseSingle(seed++, x, y, z) + 1) * fractalSettings.pingPongStrength); + sum += (noise - 0.5d) * 2 * amp; + amp *= Lerp(1.0d, noise, fractalSettings.weightedStrength); + + x *= fractalSettings.lacunarity; + y *= fractalSettings.lacunarity; + z *= fractalSettings.lacunarity; + amp *= fractalSettings.gain; + } + + return sum; + } + + private double SingleSimplex(long seed, double x, double y) { + + final double SQRT3 = 1.7320508075688772935274463415059d; + final double G2 = (3 - SQRT3) / 6; + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = (double) (x - i); + double yi = (double) (y - j); + + double t = (xi + yi) * G2; + double x0 = (double) (xi - t); + double y0 = (double) (yi - t); + + i *= PrimeX; + j *= PrimeY; + + double n0, n1, n2; + + double a = 0.5d - x0 * x0 - y0 * y0; + if (a <= 0) + n0 = 0; + else { + n0 = (a * a) * (a * a) * GradCoord(seed, i, j, x0, y0); + } + + double c = (double) (2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((double) (-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c <= 0) + n2 = 0; + else { + double x2 = x0 + (2 * (double) G2 - 1); + double y2 = y0 + (2 * (double) G2 - 1); + n2 = (c * c) * (c * c) * GradCoord(seed, i + PrimeX, j + PrimeY, x2, y2); + } + + if (y0 > x0) { + double x1 = x0 + (double) G2; + double y1 = y0 + ((double) G2 - 1); + double b = 0.5d - x1 * x1 - y1 * y1; + if (b <= 0) + n1 = 0; + else { + n1 = (b * b) * (b * b) * GradCoord(seed, i, j + PrimeY, x1, y1); + } + } else { + double x1 = x0 + ((double) G2 - 1); + double y1 = y0 + (double) G2; + double b = 0.5d - x1 * x1 - y1 * y1; + if (b <= 0) + n1 = 0; + else { + n1 = (b * b) * (b * b) * GradCoord(seed, i + PrimeX, j, x1, y1); + } + } + + return (n0 + n1 + n2) * 99.83685446303647d; + } + + private double SingleOpenSimplex2(long seed, double x, double y, double z) { + + int i = FastRound(x); + int j = FastRound(y); + int k = FastRound(z); + double x0 = (double) (x - i); + double y0 = (double) (y - j); + double z0 = (double) (z - k); + + int xNSign = (int) (-1.0d - x0) | 1; + int yNSign = (int) (-1.0d - y0) | 1; + int zNSign = (int) (-1.0d - z0) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + + double value = 0; + double a = (0.6d - x0 * x0) - (y0 * y0 + z0 * z0); + + for (int l = 0;; l++) { + if (a > 0) { + value += (a * a) * (a * a) * GradCoord(seed, i, j, k, x0, y0, z0); + } + + if (ax0 >= ay0 && ax0 >= az0) { + double b = a + ax0 + ax0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i - xNSign * PrimeX, j, k, x0 + xNSign, y0, z0); + } + } else if (ay0 > ax0 && ay0 >= az0) { + double b = a + ay0 + ay0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i, j - yNSign * PrimeY, k, x0, y0 + yNSign, z0); + } + } else { + double b = a + az0 + az0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i, j, k - zNSign * PrimeZ, x0, y0, z0 + zNSign); + } + } + + if (l == 1) + break; + + ax0 = 0.5d - ax0; + ay0 = 0.5d - ay0; + az0 = 0.5d - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75d - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PrimeX; + j += (yNSign >> 1) & PrimeY; + k += (zNSign >> 1) & PrimeZ; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed = ~seed; + } + + return value * 32.69428253173828125d; + } + + private double SingleOpenSimplex2S(long seed, double x, double y) { + + final double SQRT3 = (double) 1.7320508075688772935274463415059; + final double G2 = (3 - SQRT3) / 6; + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = (double) (x - i); + double yi = (double) (y - j); + + i *= PrimeX; + j *= PrimeY; + int i1 = i + PrimeX; + int j1 = j + PrimeY; + + double t = (xi + yi) * (double) G2; + double x0 = xi - t; + double y0 = yi - t; + + double a0 = (2.0d / 3.0d) - x0 * x0 - y0 * y0; + double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i, j, x0, y0); + + double a1 = (double) (2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((double) (-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); + double x1 = x0 - (double) (1 - 2 * G2); + double y1 = y0 - (double) (1 - 2 * G2); + value += (a1 * a1) * (a1 * a1) * GradCoord(seed, i1, j1, x1, y1); + + double xmyi = xi - yi; + if (t > G2) { + if (xi + xmyi > 1) { + double x2 = x0 + (double) (3 * G2 - 2); + double y2 = y0 + (double) (3 * G2 - 1); + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (PrimeX << 1), j + PrimeY, x2, y2); + } + } else { + double x2 = x0 + (double) G2; + double y2 = y0 + (double) (G2 - 1); + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + } + } + + if (yi - xmyi > 1) { + double x3 = x0 + (double) (3 * G2 - 1); + double y3 = y0 + (double) (3 * G2 - 2); + double a3 = (2.0d / 3.0d) - x3 * x3 - y3 * y3; + if (a3 > 0) { + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j + (PrimeY << 1), x3, y3); + } + } else { + double x3 = x0 + (double) (G2 - 1); + double y3 = y0 + (double) G2; + double a3 = (2.0d / 3.0d) - x3 * x3 - y3 * y3; + if (a3 > 0) { + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j, x3, y3); + } + } + } else { + if (xi + xmyi < 0) { + double x2 = x0 + (double) (1 - G2); + double y2 = y0 - (double) G2; + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i - PrimeX, j, x2, y2); + } + } else { + double x2 = x0 + (double) (G2 - 1); + double y2 = y0 + (double) G2; + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + PrimeX, j, x2, y2); + } + } + + if (yi < xmyi) { + double x2 = x0 - (double) G2; + double y2 = y0 - (double) (G2 - 1); + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j - PrimeY, x2, y2); + } + } else { + double x2 = x0 + (double) G2; + double y2 = y0 + (double) (G2 - 1); + double a2 = (2.0d / 3.0d) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + } + } + } + + return value * 18.24196194486065d; + } + + private double SingleOpenSimplex2S(long seed, double x, double y, double z) { + + int i = FastFloor(x); + int j = FastFloor(y); + int k = FastFloor(z); + double xi = (double) (x - i); + double yi = (double) (y - j); + double zi = (double) (z - k); + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + long seed2 = seed + 1293373; + + int xNMask = (int) (-0.5d - xi); + int yNMask = (int) (-0.5d - yi); + int zNMask = (int) (-0.5d - zi); + + double x0 = xi + xNMask; + double y0 = yi + yNMask; + double z0 = zi + zNMask; + double a0 = 0.75d - x0 * x0 - y0 * y0 - z0 * z0; + double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x0, y0, z0); + + double x1 = xi - 0.5d; + double y1 = yi - 0.5d; + double z1 = zi - 0.5d; + double a1 = 0.75d - x1 * x1 - y1 * y1 - z1 * z1; + value += (a1 * a1) * (a1 * a1) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + PrimeZ, x1, y1, z1); + + double xAFlipMask0 = ((xNMask | 1) << 1) * x1; + double yAFlipMask0 = ((yNMask | 1) << 1) * y1; + double zAFlipMask0 = ((zNMask | 1) << 1) * z1; + double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0d; + double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0d; + double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0d; + + boolean skip5 = false; + double a2 = xAFlipMask0 + a0; + if (a2 > 0) { + double x2 = x0 - (xNMask | 1); + double y2 = y0; + double z2 = z0; + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x2, y2, z2); + } else { + double a3 = yAFlipMask0 + zAFlipMask0 + a0; + if (a3 > 0) { + double x3 = x0; + double y3 = y0 - (yNMask | 1); + double z3 = z0 - (zNMask | 1); + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (~zNMask & PrimeZ), x3, y3, z3); + } + + double a4 = xAFlipMask1 + a1; + if (a4 > 0) { + double x4 = (xNMask | 1) + x1; + double y4 = y1; + double z4 = z1; + value += (a4 * a4) * (a4 * a4) * GradCoord(seed2, i + (xNMask & (PrimeX * 2)), j + PrimeY, k + PrimeZ, x4, y4, z4); + skip5 = true; + } + } + + boolean skip9 = false; + double a6 = yAFlipMask0 + a0; + if (a6 > 0) { + double x6 = x0; + double y6 = y0 - (yNMask | 1); + double z6 = z0; + value += (a6 * a6) * (a6 * a6) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), x6, y6, z6); + } else { + double a7 = xAFlipMask0 + zAFlipMask0 + a0; + if (a7 > 0) { + double x7 = x0 - (xNMask | 1); + double y7 = y0; + double z7 = z0 - (zNMask | 1); + value += (a7 * a7) * (a7 * a7) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), x7, y7, z7); + } + + double a8 = yAFlipMask1 + a1; + if (a8 > 0) { + double x8 = x1; + double y8 = (yNMask | 1) + y1; + double z8 = z1; + value += (a8 * a8) * (a8 * a8) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + PrimeZ, x8, y8, z8); + skip9 = true; + } + } + + boolean skipD = false; + double aA = zAFlipMask0 + a0; + if (aA > 0) { + double xA = x0; + double yA = y0; + double zA = z0 - (zNMask | 1); + value += (aA * aA) * (aA * aA) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), xA, yA, zA); + } else { + double aB = xAFlipMask0 + yAFlipMask0 + a0; + if (aB > 0) { + double xB = x0 - (xNMask | 1); + double yB = y0 - (yNMask | 1); + double zB = z0; + value += (aB * aB) * (aB * aB) * GradCoord(seed, i + (~xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), xB, yB, zB); + } + + double aC = zAFlipMask1 + a1; + if (aC > 0) { + double xC = x1; + double yC = y1; + double zC = (zNMask | 1) + z1; + value += (aC * aC) * (aC * aC) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + (zNMask & (PrimeZ << 1)), xC, yC, zC); + skipD = true; + } + } + + if (!skip5) { + double a5 = yAFlipMask1 + zAFlipMask1 + a1; + if (a5 > 0) { + double x5 = x1; + double y5 = (yNMask | 1) + y1; + double z5 = (zNMask | 1) + z1; + value += (a5 * a5) * (a5 * a5) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + (zNMask & (PrimeZ << 1)), x5, y5, z5); + } + } + + if (!skip9) { + double a9 = xAFlipMask1 + zAFlipMask1 + a1; + if (a9 > 0) { + double x9 = (xNMask | 1) + x1; + double y9 = y1; + double z9 = (zNMask | 1) + z1; + value += (a9 * a9) * (a9 * a9) * GradCoord(seed2, i + (xNMask & (PrimeX * 2)), j + PrimeY, k + (zNMask & (PrimeZ << 1)), x9, y9, z9); + } + } + + if (!skipD) { + double aD = xAFlipMask1 + yAFlipMask1 + a1; + if (aD > 0) { + double xD = (xNMask | 1) + x1; + double yD = (yNMask | 1) + y1; + double zD = z1; + value += (aD * aD) * (aD * aD) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + (yNMask & (PrimeY << 1)), k + PrimeZ, xD, yD, zD); + } + } + + return value * 9.046026385208288d; + } + + private double SingleCellular(long seed, double x, double y) { + int xr = FastRound(x); + int yr = FastRound(y); + + double distance0 = Double.MAX_VALUE; + double distance1 = Double.MAX_VALUE; + int closestHash = 0; + + double cellularJitter = 0.43701595d * cellularSettings.jitter; + + int xPrimed = (xr - 1) * PrimeX; + int yPrimedBase = (yr - 1) * PrimeY; + + switch (cellularSettings.distanceFunction) { + default: + case Euclidean: + case EuclideanSq: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (double) (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = vecX * vecX + vecY * vecY; + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Manhattan: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (double) (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = FastAbs(vecX) + FastAbs(vecY); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Hybrid: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (double) (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = (FastAbs(vecX) + FastAbs(vecY)) + (vecX * vecX + vecY * vecY); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + } + + if (cellularSettings.distanceFunction == CellularDistanceFunction.Euclidean && cellularSettings.returnType != CellularReturnType.CellValue) { + distance0 = FastSqrt(distance0); + + if (cellularSettings.returnType != CellularReturnType.CellValue) { + distance1 = FastSqrt(distance1); + } + } + + switch (cellularSettings.returnType) { + case CellValue: + return closestHash * (1 / 2147483648.0d); + case Distance: + return distance0 - 1; + case Distance2: + return distance1 - 1; + case Distance2Add: + return (distance1 + distance0) * 0.5d - 1; + case Distance2Sub: + return distance1 - distance0 - 1; + case Distance2Mul: + return distance1 * distance0 * 0.5d - 1; + case Distance2Div: + return distance0 / distance1 - 1; + default: + return 0; + } + } + + private double SingleCellular(long seed, double x, double y, double z) { + int xr = FastRound(x); + int yr = FastRound(y); + int zr = FastRound(z); + + double distance0 = Double.MAX_VALUE; + double distance1 = Double.MAX_VALUE; + int closestHash = 0; + + double cellularJitter = 0.39614353d * cellularSettings.jitter; + + int xPrimed = (xr - 1) * PrimeX; + int yPrimedBase = (yr - 1) * PrimeY; + int zPrimedBase = (zr - 1) * PrimeZ; + + switch (cellularSettings.distanceFunction) { + case Euclidean: + case EuclideanSq: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (double) (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (double) (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Manhattan: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (double) (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (double) (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Hybrid: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (double) (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (double) (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (double) (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = (FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + default: + break; + } + + if (cellularSettings.distanceFunction == CellularDistanceFunction.Euclidean && cellularSettings.returnType != CellularReturnType.CellValue) { + distance0 = FastSqrt(distance0); + + if (cellularSettings.returnType != CellularReturnType.CellValue) { + distance1 = FastSqrt(distance1); + } + } + + switch (cellularSettings.returnType) { + case CellValue: + return closestHash * (1 / 2147483648.0d); + case Distance: + return distance0 - 1; + case Distance2: + return distance1 - 1; + case Distance2Add: + return (distance1 + distance0) * 0.5d - 1; + case Distance2Sub: + return distance1 - distance0 - 1; + case Distance2Mul: + return distance1 * distance0 * 0.5d - 1; + case Distance2Div: + return distance0 / distance1 - 1; + default: + return 0; + } + } + + private double SinglePerlin(long seed, double x, double y) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + + double xd0 = (double) (x - x0); + double yd0 = (double) (y - y0); + double xd1 = xd0 - 1; + double yd1 = yd0 - 1; + + double xs = InterpQuintic(xd0); + double ys = InterpQuintic(yd0); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + double xf0 = Lerp(GradCoord(seed, x0, y0, xd0, yd0), GradCoord(seed, x1, y0, xd1, yd0), xs); + double xf1 = Lerp(GradCoord(seed, x0, y1, xd0, yd1), GradCoord(seed, x1, y1, xd1, yd1), xs); + + return Lerp(xf0, xf1, ys) * 1.4247691104677813d; + } + + private double SinglePerlin(long seed, double x, double y, double z) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + int z0 = FastFloor(z); + + double xd0 = (double) (x - x0); + double yd0 = (double) (y - y0); + double zd0 = (double) (z - z0); + double xd1 = xd0 - 1; + double yd1 = yd0 - 1; + double zd1 = zd0 - 1; + + double xs = InterpQuintic(xd0); + double ys = InterpQuintic(yd0); + double zs = InterpQuintic(zd0); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + double xf00 = Lerp(GradCoord(seed, x0, y0, z0, xd0, yd0, zd0), GradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); + double xf10 = Lerp(GradCoord(seed, x0, y1, z0, xd0, yd1, zd0), GradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); + double xf01 = Lerp(GradCoord(seed, x0, y0, z1, xd0, yd0, zd1), GradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); + double xf11 = Lerp(GradCoord(seed, x0, y1, z1, xd0, yd1, zd1), GradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); + + double yf0 = Lerp(xf00, xf10, ys); + double yf1 = Lerp(xf01, xf11, ys); + + return Lerp(yf0, yf1, zs) * 0.964921414852142333984375d; + } + + private double SingleValueCubic(long seed, double x, double y) { + int x1 = FastFloor(x); + int y1 = FastFloor(y); + + double xs = (double) (x - x1); + double ys = (double) (y - y1); + + x1 *= PrimeX; + y1 *= PrimeY; + int x0 = x1 - PrimeX; + int y0 = y1 - PrimeY; + int x2 = x1 + PrimeX; + int y2 = y1 + PrimeY; + int x3 = x1 + (PrimeX << 1); + int y3 = y1 + (PrimeY << 1); + + return CubicLerp(CubicLerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), ValCoord(seed, x2, y0), ValCoord(seed, x3, y0), xs), + CubicLerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), ValCoord(seed, x2, y1), ValCoord(seed, x3, y1), xs), + CubicLerp(ValCoord(seed, x0, y2), ValCoord(seed, x1, y2), ValCoord(seed, x2, y2), ValCoord(seed, x3, y2), xs), + CubicLerp(ValCoord(seed, x0, y3), ValCoord(seed, x1, y3), ValCoord(seed, x2, y3), ValCoord(seed, x3, y3), xs), ys) * (1 / (1.5d * 1.5d)); + } + + private double SingleValueCubic(long seed, double x, double y, double z) { + int x1 = FastFloor(x); + int y1 = FastFloor(y); + int z1 = FastFloor(z); + + double xs = (double) (x - x1); + double ys = (double) (y - y1); + double zs = (double) (z - z1); + + x1 *= PrimeX; + y1 *= PrimeY; + z1 *= PrimeZ; + + int x0 = x1 - PrimeX; + int y0 = y1 - PrimeY; + int z0 = z1 - PrimeZ; + int x2 = x1 + PrimeX; + int y2 = y1 + PrimeY; + int z2 = z1 + PrimeZ; + int x3 = x1 + (PrimeX << 1); + int y3 = y1 + (PrimeY << 1); + int z3 = z1 + (PrimeZ << 1); + + return CubicLerp( + CubicLerp(CubicLerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), ValCoord(seed, x2, y0, z0), ValCoord(seed, x3, y0, z0), xs), + CubicLerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), ValCoord(seed, x2, y1, z0), ValCoord(seed, x3, y1, z0), xs), + CubicLerp(ValCoord(seed, x0, y2, z0), ValCoord(seed, x1, y2, z0), ValCoord(seed, x2, y2, z0), ValCoord(seed, x3, y2, z0), xs), + CubicLerp(ValCoord(seed, x0, y3, z0), ValCoord(seed, x1, y3, z0), ValCoord(seed, x2, y3, z0), ValCoord(seed, x3, y3, z0), xs), ys), + CubicLerp(CubicLerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), ValCoord(seed, x2, y0, z1), ValCoord(seed, x3, y0, z1), xs), + CubicLerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), ValCoord(seed, x2, y1, z1), ValCoord(seed, x3, y1, z1), xs), + CubicLerp(ValCoord(seed, x0, y2, z1), ValCoord(seed, x1, y2, z1), ValCoord(seed, x2, y2, z1), ValCoord(seed, x3, y2, z1), xs), + CubicLerp(ValCoord(seed, x0, y3, z1), ValCoord(seed, x1, y3, z1), ValCoord(seed, x2, y3, z1), ValCoord(seed, x3, y3, z1), xs), ys), + CubicLerp(CubicLerp(ValCoord(seed, x0, y0, z2), ValCoord(seed, x1, y0, z2), ValCoord(seed, x2, y0, z2), ValCoord(seed, x3, y0, z2), xs), + CubicLerp(ValCoord(seed, x0, y1, z2), ValCoord(seed, x1, y1, z2), ValCoord(seed, x2, y1, z2), ValCoord(seed, x3, y1, z2), xs), + CubicLerp(ValCoord(seed, x0, y2, z2), ValCoord(seed, x1, y2, z2), ValCoord(seed, x2, y2, z2), ValCoord(seed, x3, y2, z2), xs), + CubicLerp(ValCoord(seed, x0, y3, z2), ValCoord(seed, x1, y3, z2), ValCoord(seed, x2, y3, z2), ValCoord(seed, x3, y3, z2), xs), ys), + CubicLerp(CubicLerp(ValCoord(seed, x0, y0, z3), ValCoord(seed, x1, y0, z3), ValCoord(seed, x2, y0, z3), ValCoord(seed, x3, y0, z3), xs), + CubicLerp(ValCoord(seed, x0, y1, z3), ValCoord(seed, x1, y1, z3), ValCoord(seed, x2, y1, z3), ValCoord(seed, x3, y1, z3), xs), + CubicLerp(ValCoord(seed, x0, y2, z3), ValCoord(seed, x1, y2, z3), ValCoord(seed, x2, y2, z3), ValCoord(seed, x3, y2, z3), xs), + CubicLerp(ValCoord(seed, x0, y3, z3), ValCoord(seed, x1, y3, z3), ValCoord(seed, x2, y3, z3), ValCoord(seed, x3, y3, z3), xs), ys), + zs) * (1 / (1.5d * 1.5d * 1.5d)); + } + + private double SingleValue(long seed, double x, double y) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + + double xs = InterpHermite((double) (x - x0)); + double ys = InterpHermite((double) (y - y0)); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + double xf0 = Lerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), xs); + double xf1 = Lerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), xs); + + return Lerp(xf0, xf1, ys); + } + + private double SingleValue(long seed, double x, double y, double z) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + int z0 = FastFloor(z); + + double xs = InterpHermite((double) (x - x0)); + double ys = InterpHermite((double) (y - y0)); + double zs = InterpHermite((double) (z - z0)); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + double xf00 = Lerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), xs); + double xf10 = Lerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), xs); + double xf01 = Lerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), xs); + double xf11 = Lerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), xs); + + double yf0 = Lerp(xf00, xf10, ys); + double yf1 = Lerp(xf01, xf11, ys); + + return Lerp(yf0, yf1, zs); + } + + private void DoSingleDomainWarp(DomainWarpType domainWarpType, long seed, double amp, double freq, double x, double y, Vector2 coord) { + switch (domainWarpType) { + case OpenSimplex2: + SingleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375d, freq, x, y, coord, false); + break; + case OpenSimplex2Reduced: + SingleDomainWarpSimplexGradient(seed, amp * 16.0d, freq, x, y, coord, true); + break; + case BasicGrid: + SingleDomainWarpBasicGrid(seed, amp, freq, x, y, coord); + break; + case None: + break; + } + } + + private void DoSingleDomainWarp(DomainWarpType domainWarpType, long seed, double amp, double freq, double x, double y, double z, Vector3 coord) { + switch (domainWarpType) { + case OpenSimplex2: + SingleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125d, freq, x, y, z, coord, false); + break; + case OpenSimplex2Reduced: + SingleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605d, freq, x, y, z, coord, true); + break; + case BasicGrid: + SingleDomainWarpBasicGrid(seed, amp, freq, x, y, z, coord); + break; + case None: + break; + } + } + + private void DomainWarpSingle(Vector2 coord, long worldSeed) { + long seed = worldSeed; + double amp = domainWarpSettings.amplitude * domainWarpSettings.fractalBounding; + double freq = domainWarpSettings.frequency; + + double xs = coord.x; + double ys = coord.y; + switch (domainWarpSettings.domainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + final double SQRT3 = (double) 1.7320508075688772935274463415059; + final double F2 = 0.5d * (SQRT3 - 1); + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + DoSingleDomainWarp(domainWarpSettings.domainWarpType, seed, amp, freq, xs, ys, coord); + } + + private void DomainWarpSingle(Vector3 coord, long worldSeed) { + long seed = worldSeed; + double amp = domainWarpSettings.amplitude * domainWarpSettings.fractalBounding; + double freq = domainWarpSettings.frequency; + + double xs = coord.x; + double ys = coord.y; + double zs = coord.z; + switch (domainWarpSettings.transformTypeType3D) { + case ImproveXYPlanes: { + double xy = xs + ys; + double s2 = xy * -(double) 0.211324865405187; + zs *= (double) 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + zs += xy * (double) 0.577350269189626; + } + break; + case ImproveXZPlanes: { + double xz = xs + zs; + double s2 = xz * -(double) 0.211324865405187; + ys *= (double) 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + ys += xz * (double) 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + final double R3 = (double) (2.0 / 3.0); + double r = (xs + ys + zs) * R3; + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + DoSingleDomainWarp(domainWarpSettings.domainWarpType, seed, amp, freq, xs, ys, zs, coord); + } + + private void DomainWarpFractalProgressive(Vector2 coord, long worldSeed) { + long seed = worldSeed; + double amp = domainWarpFractalSettings.amplitude * domainWarpFractalSettings.fractalBounding; + double freq = domainWarpFractalSettings.frequency; + + for (int i = 0; i < domainWarpFractalSettings.octaves; i++) { + double xs = coord.x; + double ys = coord.y; + switch (domainWarpFractalSettings.domainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + final double SQRT3 = (double) 1.7320508075688772935274463415059; + final double F2 = 0.5d * (SQRT3 - 1); + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + DoSingleDomainWarp(domainWarpFractalSettings.domainWarpType, seed, amp, freq, xs, ys, coord); + + seed++; + amp *= domainWarpFractalSettings.gain; + freq *= domainWarpFractalSettings.lacunarity; + } + } + + private void DomainWarpFractalProgressive(Vector3 coord, long worldSeed) { + long seed = worldSeed; + double amp = domainWarpFractalSettings.amplitude * domainWarpFractalSettings.fractalBounding; + double freq = domainWarpFractalSettings.frequency; + + for (int i = 0; i < domainWarpFractalSettings.octaves; i++) { + double xs = coord.x; + double ys = coord.y; + double zs = coord.z; + switch (domainWarpFractalSettings.transformTypeType3D) { + case ImproveXYPlanes: { + double xy = xs + ys; + double s2 = xy * -(double) 0.211324865405187; + zs *= (double) 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + zs += xy * (double) 0.577350269189626; + } + break; + case ImproveXZPlanes: { + double xz = xs + zs; + double s2 = xz * -(double) 0.211324865405187; + ys *= (double) 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + ys += xz * (double) 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + final double R3 = (double) (2.0 / 3.0); + double r = (xs + ys + zs) * R3; + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + DoSingleDomainWarp(domainWarpFractalSettings.domainWarpType, seed, amp, freq, xs, ys, zs, coord); + + seed++; + amp *= domainWarpFractalSettings.gain; + freq *= domainWarpFractalSettings.lacunarity; + } + } + + private void DomainWarpFractalIndependent(Vector2 coord, long worldSeed) { + double xs = coord.x; + double ys = coord.y; + switch (domainWarpFractalSettings.domainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + final double SQRT3 = (double) 1.7320508075688772935274463415059; + final double F2 = 0.5d * (SQRT3 - 1); + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + long seed = worldSeed; + double amp = domainWarpFractalSettings.amplitude * domainWarpFractalSettings.fractalBounding; + double freq = domainWarpFractalSettings.frequency; + + for (int i = 0; i < domainWarpFractalSettings.octaves; i++) { + DoSingleDomainWarp(domainWarpFractalSettings.domainWarpType, seed, amp, freq, xs, ys, coord); + + seed++; + amp *= domainWarpFractalSettings.gain; + freq *= domainWarpFractalSettings.lacunarity; + } + } + + private void DomainWarpFractalIndependent(Vector3 coord, long worldSeed) { + double xs = coord.x; + double ys = coord.y; + double zs = coord.z; + switch (domainWarpFractalSettings.transformTypeType3D) { + case ImproveXYPlanes: { + double xy = xs + ys; + double s2 = xy * -(double) 0.211324865405187; + zs *= (double) 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + zs += xy * (double) 0.577350269189626; + } + break; + case ImproveXZPlanes: { + double xz = xs + zs; + double s2 = xz * -(double) 0.211324865405187; + ys *= (double) 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + ys += xz * (double) 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + final double R3 = (double) (2.0 / 3.0); + double r = (xs + ys + zs) * R3; + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + long seed = worldSeed; + double amp = domainWarpFractalSettings.amplitude * domainWarpFractalSettings.fractalBounding; + double freq = domainWarpFractalSettings.frequency; + + for (int i = 0; i < domainWarpFractalSettings.octaves; i++) { + DoSingleDomainWarp(domainWarpFractalSettings.domainWarpType, seed, amp, freq, xs, ys, zs, coord); + + seed++; + amp *= domainWarpFractalSettings.gain; + freq *= domainWarpFractalSettings.lacunarity; + } + } + + private void SingleDomainWarpBasicGrid(long seed, double warpAmp, double frequency, double x, double y, Vector2 coord) { + double xf = x * frequency; + double yf = y * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + + double xs = InterpHermite((double) (xf - x0)); + double ys = InterpHermite((double) (yf - y0)); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + int hash0 = Hash(seed, x0, y0) & (255 << 1); + int hash1 = Hash(seed, x1, y0) & (255 << 1); + + double lx0x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); + double ly0x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + + hash0 = Hash(seed, x0, y1) & (255 << 1); + hash1 = Hash(seed, x1, y1) & (255 << 1); + + double lx1x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); + double ly1x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + + coord.x += Lerp(lx0x, lx1x, ys) * warpAmp; + coord.y += Lerp(ly0x, ly1x, ys) * warpAmp; + } + + private void SingleDomainWarpBasicGrid(long seed, double warpAmp, double frequency, double x, double y, double z, Vector3 coord) { + double xf = x * frequency; + double yf = y * frequency; + double zf = z * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + int z0 = FastFloor(zf); + + double xs = InterpHermite((double) (xf - x0)); + double ys = InterpHermite((double) (yf - y0)); + double zs = InterpHermite((double) (zf - z0)); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + int hash0 = Hash(seed, x0, y0, z0) & (255 << 2); + int hash1 = Hash(seed, x1, y0, z0) & (255 << 2); + + double lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + double ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + double lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + hash0 = Hash(seed, x0, y1, z0) & (255 << 2); + hash1 = Hash(seed, x1, y1, z0) & (255 << 2); + + double lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + double ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + double lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + double lx0y = Lerp(lx0x, lx1x, ys); + double ly0y = Lerp(ly0x, ly1x, ys); + double lz0y = Lerp(lz0x, lz1x, ys); + + hash0 = Hash(seed, x0, y0, z1) & (255 << 2); + hash1 = Hash(seed, x1, y0, z1) & (255 << 2); + + lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + hash0 = Hash(seed, x0, y1, z1) & (255 << 2); + hash1 = Hash(seed, x1, y1, z1) & (255 << 2); + + lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + coord.x += Lerp(lx0y, Lerp(lx0x, lx1x, ys), zs) * warpAmp; + coord.y += Lerp(ly0y, Lerp(ly0x, ly1x, ys), zs) * warpAmp; + coord.z += Lerp(lz0y, Lerp(lz0x, lz1x, ys), zs) * warpAmp; + } + + private void SingleDomainWarpSimplexGradient(long seed, double warpAmp, double frequency, double x, double y, Vector2 coord, boolean outGradOnly) { + final double SQRT3 = 1.7320508075688772935274463415059d; + final double G2 = (3 - SQRT3) / 6; + + x *= frequency; + y *= frequency; + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = (double) (x - i); + double yi = (double) (y - j); + + double t = (xi + yi) * G2; + double x0 = (double) (xi - t); + double y0 = (double) (yi - t); + + i *= PrimeX; + j *= PrimeY; + + double vx, vy; + vx = vy = 0; + + double a = 0.5d - x0 * x0 - y0 * y0; + if (a > 0) { + double aaaa = (a * a) * (a * a); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i, j) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x0 * xg + y0 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += aaaa * xo; + vy += aaaa * yo; + } + + double c = (double) (2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((double) (-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c > 0) { + double x2 = x0 + (2 * (double) G2 - 1); + double y2 = y0 + (2 * (double) G2 - 1); + double cccc = (c * c) * (c * c); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i + PrimeX, j + PrimeY) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i + PrimeX, j + PrimeY); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x2 * xg + y2 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += cccc * xo; + vy += cccc * yo; + } + + if (y0 > x0) { + double x1 = x0 + (double) G2; + double y1 = y0 + ((double) G2 - 1); + double b = 0.5d - x1 * x1 - y1 * y1; + if (b > 0) { + double bbbb = (b * b) * (b * b); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i, j + PrimeY) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i, j + PrimeY); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += bbbb * xo; + vy += bbbb * yo; + } + } else { + double x1 = x0 + ((double) G2 - 1); + double y1 = y0 + (double) G2; + double b = 0.5d - x1 * x1 - y1 * y1; + if (b > 0) { + double bbbb = (b * b) * (b * b); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i + PrimeX, j) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i + PrimeX, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += bbbb * xo; + vy += bbbb * yo; + } + } + + coord.x += vx * warpAmp; + coord.y += vy * warpAmp; + } + + private void SingleDomainWarpOpenSimplex2Gradient(long seed, double warpAmp, double frequency, double x, double y, double z, Vector3 coord, boolean outGradOnly) { + x *= frequency; + y *= frequency; + z *= frequency; + + int i = FastRound(x); + int j = FastRound(y); + int k = FastRound(z); + double x0 = (double) x - i; + double y0 = (double) y - j; + double z0 = (double) z - k; + + int xNSign = (int) (-x0 - 1.0d) | 1; + int yNSign = (int) (-y0 - 1.0d) | 1; + int zNSign = (int) (-z0 - 1.0d) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + + double vx, vy, vz; + vx = vy = vz = 0; + + double a = (0.6d - x0 * x0) - (y0 * y0 + z0 * z0); + for (int l = 0;; l++) { + if (a > 0) { + double aaaa = (a * a) * (a * a); + double xo, yo, zo; + if (outGradOnly) { + int hash = Hash(seed, i, j, k) & (255 << 2); + xo = RandVecs3D[hash]; + yo = RandVecs3D[hash | 1]; + zo = RandVecs3D[hash | 2]; + } else { + int hash = Hash(seed, i, j, k); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = Gradients3D[index1]; + double yg = Gradients3D[index1 | 1]; + double zg = Gradients3D[index1 | 2]; + double value = x0 * xg + y0 * yg + z0 * zg; + double xgo = RandVecs3D[index2]; + double ygo = RandVecs3D[index2 | 1]; + double zgo = RandVecs3D[index2 | 2]; + xo = value * xgo; + yo = value * ygo; + zo = value * zgo; + } + vx += aaaa * xo; + vy += aaaa * yo; + vz += aaaa * zo; + } + + double b = a; + int i1 = i; + int j1 = j; + int k1 = k; + double x1 = x0; + double y1 = y0; + double z1 = z0; + + if (ax0 >= ay0 && ax0 >= az0) { + x1 += xNSign; + b = b + ax0 + ax0; + i1 -= xNSign * PrimeX; + } else if (ay0 > ax0 && ay0 >= az0) { + y1 += yNSign; + b = b + ay0 + ay0; + j1 -= yNSign * PrimeY; + } else { + z1 += zNSign; + b = b + az0 + az0; + k1 -= zNSign * PrimeZ; + } + + if (b > 1) { + b -= 1; + double bbbb = (b * b) * (b * b); + double xo, yo, zo; + if (outGradOnly) { + int hash = Hash(seed, i1, j1, k1) & (255 << 2); + xo = RandVecs3D[hash]; + yo = RandVecs3D[hash | 1]; + zo = RandVecs3D[hash | 2]; + } else { + int hash = Hash(seed, i1, j1, k1); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = Gradients3D[index1]; + double yg = Gradients3D[index1 | 1]; + double zg = Gradients3D[index1 | 2]; + double value = x1 * xg + y1 * yg + z1 * zg; + double xgo = RandVecs3D[index2]; + double ygo = RandVecs3D[index2 | 1]; + double zgo = RandVecs3D[index2 | 2]; + xo = value * xgo; + yo = value * ygo; + zo = value * zgo; + } + vx += bbbb * xo; + vy += bbbb * yo; + vz += bbbb * zo; + } + + if (l == 1) + break; + + ax0 = 0.5d - ax0; + ay0 = 0.5d - ay0; + az0 = 0.5d - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75d - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PrimeX; + j += (yNSign >> 1) & PrimeY; + k += (zNSign >> 1) & PrimeZ; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed += 1293373; + } + + coord.x += vx * warpAmp; + coord.y += vy * warpAmp; + coord.z += vz * warpAmp; + } + + private static final double[] Gradients2D = { 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, + 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, + 0.793353340291235d, -0.60876142900872d, 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, -0.130526192220052d, + -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, + -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, -0.608761429008721d, + 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, + 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, 0.99144486137381d, + -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, + 0.130526192220052d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, -0.793353340291235d, + -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, + -0.793353340291235d, 0.608761429008721d, -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, 0.130526192220052d, + 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, + 0.99144486137381d, 0.130526192220051d, 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, 0.608761429008721d, + -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, + -0.608761429008721d, -0.793353340291235d, -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, + 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, + -0.130526192220052d, 0.99144486137381d, 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, + 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, 0.99144486137381d, -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, + 0.793353340291235d, -0.60876142900872d, 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, 0.130526192220052d, -0.99144486137381d, -0.130526192220052d, + -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, -0.793353340291235d, -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, + -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, -0.793353340291235d, 0.608761429008721d, -0.608761429008721d, + 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, 0.130526192220052d, 0.99144486137381d, 0.38268343236509d, 0.923879532511287d, + 0.608761429008721d, 0.793353340291235d, 0.793353340291235d, 0.608761429008721d, 0.923879532511287d, 0.38268343236509d, 0.99144486137381d, 0.130526192220051d, 0.99144486137381d, + -0.130526192220051d, 0.923879532511287d, -0.38268343236509d, 0.793353340291235d, -0.60876142900872d, 0.608761429008721d, -0.793353340291235d, 0.38268343236509d, -0.923879532511287d, + 0.130526192220052d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, -0.38268343236509d, -0.923879532511287d, -0.608761429008721d, -0.793353340291235d, -0.793353340291235d, + -0.608761429008721d, -0.923879532511287d, -0.38268343236509d, -0.99144486137381d, -0.130526192220052d, -0.99144486137381d, 0.130526192220051d, -0.923879532511287d, 0.38268343236509d, + -0.793353340291235d, 0.608761429008721d, -0.608761429008721d, 0.793353340291235d, -0.38268343236509d, 0.923879532511287d, -0.130526192220052d, 0.99144486137381d, 0.38268343236509d, + 0.923879532511287d, 0.923879532511287d, 0.38268343236509d, 0.923879532511287d, -0.38268343236509d, 0.38268343236509d, -0.923879532511287d, -0.38268343236509d, -0.923879532511287d, + -0.923879532511287d, -0.38268343236509d, -0.923879532511287d, 0.38268343236509d, -0.38268343236509d, 0.923879532511287d, }; + private static final double[] RandVecs2D = { -0.2700222198d, -0.9628540911d, 0.3863092627d, -0.9223693152d, 0.04444859006d, -0.999011673d, -0.5992523158d, -0.8005602176d, -0.7819280288d, + 0.6233687174d, 0.9464672271d, 0.3227999196d, -0.6514146797d, -0.7587218957d, 0.9378472289d, 0.347048376d, -0.8497875957d, -0.5271252623d, -0.879042592d, 0.4767432447d, -0.892300288d, + -0.4514423508d, -0.379844434d, -0.9250503802d, -0.9951650832d, 0.0982163789d, 0.7724397808d, -0.6350880136d, 0.7573283322d, -0.6530343002d, -0.9928004525d, -0.119780055d, -0.0532665713d, + 0.9985803285d, 0.9754253726d, -0.2203300762d, -0.7665018163d, 0.6422421394d, 0.991636706d, 0.1290606184d, -0.994696838d, 0.1028503788d, -0.5379205513d, -0.84299554d, 0.5022815471d, + -0.8647041387d, 0.4559821461d, -0.8899889226d, -0.8659131224d, -0.5001944266d, 0.0879458407d, -0.9961252577d, -0.5051684983d, 0.8630207346d, 0.7753185226d, -0.6315704146d, -0.6921944612d, + 0.7217110418d, -0.5191659449d, -0.8546734591d, 0.8978622882d, -0.4402764035d, -0.1706774107d, 0.9853269617d, -0.9353430106d, -0.3537420705d, -0.9992404798d, 0.03896746794d, -0.2882064021d, + -0.9575683108d, -0.9663811329d, 0.2571137995d, -0.8759714238d, -0.4823630009d, -0.8303123018d, -0.5572983775d, 0.05110133755d, -0.9986934731d, -0.8558373281d, -0.5172450752d, 0.09887025282d, + 0.9951003332d, 0.9189016087d, 0.3944867976d, -0.2439375892d, -0.9697909324d, -0.8121409387d, -0.5834613061d, -0.9910431363d, 0.1335421355d, 0.8492423985d, -0.5280031709d, -0.9717838994d, + -0.2358729591d, 0.9949457207d, 0.1004142068d, 0.6241065508d, -0.7813392434d, 0.662910307d, 0.7486988212d, -0.7197418176d, 0.6942418282d, -0.8143370775d, -0.5803922158d, 0.104521054d, + -0.9945226741d, -0.1065926113d, -0.9943027784d, 0.445799684d, -0.8951327509d, 0.105547406d, 0.9944142724d, -0.992790267d, 0.1198644477d, -0.8334366408d, 0.552615025d, 0.9115561563d, + -0.4111755999d, 0.8285544909d, -0.5599084351d, 0.7217097654d, -0.6921957921d, 0.4940492677d, -0.8694339084d, -0.3652321272d, -0.9309164803d, -0.9696606758d, 0.2444548501d, 0.08925509731d, + -0.996008799d, 0.5354071276d, -0.8445941083d, -0.1053576186d, 0.9944343981d, -0.9890284586d, 0.1477251101d, 0.004856104961d, 0.9999882091d, 0.9885598478d, 0.1508291331d, 0.9286129562d, + -0.3710498316d, -0.5832393863d, -0.8123003252d, 0.3015207509d, 0.9534596146d, -0.9575110528d, 0.2883965738d, 0.9715802154d, -0.2367105511d, 0.229981792d, 0.9731949318d, 0.955763816d, + -0.2941352207d, 0.740956116d, 0.6715534485d, -0.9971513787d, -0.07542630764d, 0.6905710663d, -0.7232645452d, -0.290713703d, -0.9568100872d, 0.5912777791d, -0.8064679708d, -0.9454592212d, + -0.325740481d, 0.6664455681d, 0.74555369d, 0.6236134912d, 0.7817328275d, 0.9126993851d, -0.4086316587d, -0.8191762011d, 0.5735419353d, -0.8812745759d, -0.4726046147d, 0.9953313627d, + 0.09651672651d, 0.9855650846d, -0.1692969699d, -0.8495980887d, 0.5274306472d, 0.6174853946d, -0.7865823463d, 0.8508156371d, 0.52546432d, 0.9985032451d, -0.05469249926d, 0.1971371563d, + -0.9803759185d, 0.6607855748d, -0.7505747292d, -0.03097494063d, 0.9995201614d, -0.6731660801d, 0.739491331d, -0.7195018362d, -0.6944905383d, 0.9727511689d, 0.2318515979d, 0.9997059088d, + -0.0242506907d, 0.4421787429d, -0.8969269532d, 0.9981350961d, -0.061043673d, -0.9173660799d, -0.3980445648d, -0.8150056635d, -0.5794529907d, -0.8789331304d, 0.4769450202d, 0.0158605829d, + 0.999874213d, -0.8095464474d, 0.5870558317d, -0.9165898907d, -0.3998286786d, -0.8023542565d, 0.5968480938d, -0.5176737917d, 0.8555780767d, -0.8154407307d, -0.5788405779d, 0.4022010347d, + -0.9155513791d, -0.9052556868d, -0.4248672045d, 0.7317445619d, 0.6815789728d, -0.5647632201d, -0.8252529947d, -0.8403276335d, -0.5420788397d, -0.9314281527d, 0.363925262d, 0.5238198472d, + 0.8518290719d, 0.7432803869d, -0.6689800195d, -0.985371561d, -0.1704197369d, 0.4601468731d, 0.88784281d, 0.825855404d, 0.5638819483d, 0.6182366099d, 0.7859920446d, 0.8331502863d, + -0.553046653d, 0.1500307506d, 0.9886813308d, -0.662330369d, -0.7492119075d, -0.668598664d, 0.743623444d, 0.7025606278d, 0.7116238924d, -0.5419389763d, -0.8404178401d, -0.3388616456d, + 0.9408362159d, 0.8331530315d, 0.5530425174d, -0.2989720662d, -0.9542618632d, 0.2638522993d, 0.9645630949d, 0.124108739d, -0.9922686234d, -0.7282649308d, -0.6852956957d, 0.6962500149d, + 0.7177993569d, -0.9183535368d, 0.3957610156d, -0.6326102274d, -0.7744703352d, -0.9331891859d, -0.359385508d, -0.1153779357d, -0.9933216659d, 0.9514974788d, -0.3076565421d, -0.08987977445d, + -0.9959526224d, 0.6678496916d, 0.7442961705d, 0.7952400393d, -0.6062947138d, -0.6462007402d, -0.7631674805d, -0.2733598753d, 0.9619118351d, 0.9669590226d, -0.254931851d, -0.9792894595d, + 0.2024651934d, -0.5369502995d, -0.8436138784d, -0.270036471d, -0.9628500944d, -0.6400277131d, 0.7683518247d, -0.7854537493d, -0.6189203566d, 0.06005905383d, -0.9981948257d, -0.02455770378d, + 0.9996984141d, -0.65983623d, 0.751409442d, -0.6253894466d, -0.7803127835d, -0.6210408851d, -0.7837781695d, 0.8348888491d, 0.5504185768d, -0.1592275245d, 0.9872419133d, 0.8367622488d, + 0.5475663786d, -0.8675753916d, -0.4973056806d, -0.2022662628d, -0.9793305667d, 0.9399189937d, 0.3413975472d, 0.9877404807d, -0.1561049093d, -0.9034455656d, 0.4287028224d, 0.1269804218d, + -0.9919052235d, -0.3819600854d, 0.924178821d, 0.9754625894d, 0.2201652486d, -0.3204015856d, -0.9472818081d, -0.9874760884d, 0.1577687387d, 0.02535348474d, -0.9996785487d, 0.4835130794d, + -0.8753371362d, -0.2850799925d, -0.9585037287d, -0.06805516006d, -0.99768156d, -0.7885244045d, -0.6150034663d, 0.3185392127d, -0.9479096845d, 0.8880043089d, 0.4598351306d, 0.6476921488d, + -0.7619021462d, 0.9820241299d, 0.1887554194d, 0.9357275128d, -0.3527237187d, -0.8894895414d, 0.4569555293d, 0.7922791302d, 0.6101588153d, 0.7483818261d, 0.6632681526d, -0.7288929755d, + -0.6846276581d, 0.8729032783d, -0.4878932944d, 0.8288345784d, 0.5594937369d, 0.08074567077d, 0.9967347374d, 0.9799148216d, -0.1994165048d, -0.580730673d, -0.8140957471d, -0.4700049791d, + -0.8826637636d, 0.2409492979d, 0.9705377045d, 0.9437816757d, -0.3305694308d, -0.8927998638d, -0.4504535528d, -0.8069622304d, 0.5906030467d, 0.06258973166d, 0.9980393407d, -0.9312597469d, + 0.3643559849d, 0.5777449785d, 0.8162173362d, -0.3360095855d, -0.941858566d, 0.697932075d, -0.7161639607d, -0.002008157227d, -0.9999979837d, -0.1827294312d, -0.9831632392d, -0.6523911722d, + 0.7578824173d, -0.4302626911d, -0.9027037258d, -0.9985126289d, -0.05452091251d, -0.01028102172d, -0.9999471489d, -0.4946071129d, 0.8691166802d, -0.2999350194d, 0.9539596344d, 0.8165471961d, + 0.5772786819d, 0.2697460475d, 0.962931498d, -0.7306287391d, -0.6827749597d, -0.7590952064d, -0.6509796216d, -0.907053853d, 0.4210146171d, -0.5104861064d, -0.8598860013d, 0.8613350597d, + 0.5080373165d, 0.5007881595d, -0.8655698812d, -0.654158152d, 0.7563577938d, -0.8382755311d, -0.545246856d, 0.6940070834d, 0.7199681717d, 0.06950936031d, 0.9975812994d, 0.1702942185d, + -0.9853932612d, 0.2695973274d, 0.9629731466d, 0.5519612192d, -0.8338697815d, 0.225657487d, -0.9742067022d, 0.4215262855d, -0.9068161835d, 0.4881873305d, -0.8727388672d, -0.3683854996d, + -0.9296731273d, -0.9825390578d, 0.1860564427d, 0.81256471d, 0.5828709909d, 0.3196460933d, -0.9475370046d, 0.9570913859d, 0.2897862643d, -0.6876655497d, -0.7260276109d, -0.9988770922d, + -0.047376731d, -0.1250179027d, 0.992154486d, -0.8280133617d, 0.560708367d, 0.9324863769d, -0.3612051451d, 0.6394653183d, 0.7688199442d, -0.01623847064d, -0.9998681473d, -0.9955014666d, + -0.09474613458d, -0.81453315d, 0.580117012d, 0.4037327978d, -0.9148769469d, 0.9944263371d, 0.1054336766d, -0.1624711654d, 0.9867132919d, -0.9949487814d, -0.100383875d, -0.6995302564d, + 0.7146029809d, 0.5263414922d, -0.85027327d, -0.5395221479d, 0.841971408d, 0.6579370318d, 0.7530729462d, 0.01426758847d, -0.9998982128d, -0.6734383991d, 0.7392433447d, 0.639412098d, + -0.7688642071d, 0.9211571421d, 0.3891908523d, -0.146637214d, -0.9891903394d, -0.782318098d, 0.6228791163d, -0.5039610839d, -0.8637263605d, -0.7743120191d, -0.6328039957d, }; + private static final double[] Gradients3D = { 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, + 0, 0, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, + -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, + 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; + private static final double[] RandVecs3D = { -0.7292736885d, -0.6618439697d, 0.1735581948d, 0, 0.790292081d, -0.5480887466d, -0.2739291014d, 0, 0.7217578935d, 0.6226212466d, -0.3023380997d, 0, + 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0, 0.3713945616d, 0.5011264475d, 0.7816254623d, 0, -0.1277062463d, -0.4254438999d, + -0.8959289049d, 0, -0.2881560924d, -0.5815838982d, 0.7607405838d, 0, 0.5849561111d, -0.662820239d, -0.4674352136d, 0, 0.3307171178d, 0.0391653737d, 0.94291689d, 0, 0.8712121778d, + -0.4113374369d, -0.2679381538d, 0, 0.580981015d, 0.7021915846d, 0.4115677815d, 0, 0.503756873d, 0.6330056931d, -0.5878203852d, 0, 0.4493712205d, 0.601390195d, 0.6606022552d, 0, -0.6878403724d, + 0.09018890807d, -0.7202371714d, 0, -0.5958956522d, -0.6469350577d, 0.475797649d, 0, -0.5127052122d, 0.1946921978d, -0.8361987284d, 0, -0.9911507142d, -0.05410276466d, -0.1212153153d, 0, + -0.2149721042d, 0.9720882117d, -0.09397607749d, 0, -0.7518650936d, -0.5428057603d, 0.3742469607d, 0, 0.5237068895d, 0.8516377189d, -0.02107817834d, 0, 0.6333504779d, 0.1926167129d, + -0.7495104896d, 0, -0.06788241606d, 0.3998305789d, 0.9140719259d, 0, -0.5538628599d, -0.4729896695d, -0.6852128902d, 0, -0.7261455366d, -0.5911990757d, 0.3509933228d, 0, -0.9229274737d, + -0.1782808786d, 0.3412049336d, 0, -0.6968815002d, 0.6511274338d, 0.3006480328d, 0, 0.9608044783d, -0.2098363234d, -0.1811724921d, 0, 0.06817146062d, -0.9743405129d, 0.2145069156d, 0, + -0.3577285196d, -0.6697087264d, -0.6507845481d, 0, -0.1868621131d, 0.7648617052d, -0.6164974636d, 0, -0.6541697588d, 0.3967914832d, 0.6439087246d, 0, 0.6993340405d, -0.6164538506d, + 0.3618239211d, 0, -0.1546665739d, 0.6291283928d, 0.7617583057d, 0, -0.6841612949d, -0.2580482182d, -0.6821542638d, 0, 0.5383980957d, 0.4258654885d, 0.7271630328d, 0, -0.5026987823d, + -0.7939832935d, -0.3418836993d, 0, 0.3202971715d, 0.2834415347d, 0.9039195862d, 0, 0.8683227101d, -0.0003762656404d, -0.4959995258d, 0, 0.791120031d, -0.08511045745d, 0.6057105799d, 0, + -0.04011016052d, -0.4397248749d, 0.8972364289d, 0, 0.9145119872d, 0.3579346169d, -0.1885487608d, 0, -0.9612039066d, -0.2756484276d, 0.01024666929d, 0, 0.6510361721d, -0.2877799159d, + -0.7023778346d, 0, -0.2041786351d, 0.7365237271d, 0.644859585d, 0, -0.7718263711d, 0.3790626912d, 0.5104855816d, 0, -0.3060082741d, -0.7692987727d, 0.5608371729d, 0, 0.454007341d, + -0.5024843065d, 0.7357899537d, 0, 0.4816795475d, 0.6021208291d, -0.6367380315d, 0, 0.6961980369d, -0.3222197429d, 0.641469197d, 0, -0.6532160499d, -0.6781148932d, 0.3368515753d, 0, + 0.5089301236d, -0.6154662304d, -0.6018234363d, 0, -0.1635919754d, -0.9133604627d, -0.372840892d, 0, 0.52408019d, -0.8437664109d, 0.1157505864d, 0, 0.5902587356d, 0.4983817807d, -0.6349883666d, + 0, 0.5863227872d, 0.494764745d, 0.6414307729d, 0, 0.6779335087d, 0.2341345225d, 0.6968408593d, 0, 0.7177054546d, -0.6858979348d, 0.120178631d, 0, -0.5328819713d, -0.5205125012d, 0.6671608058d, + 0, -0.8654874251d, -0.0700727088d, -0.4960053754d, 0, -0.2861810166d, 0.7952089234d, 0.5345495242d, 0, -0.04849529634d, 0.9810836427d, -0.1874115585d, 0, -0.6358521667d, 0.6058348682d, + 0.4781800233d, 0, 0.6254794696d, -0.2861619734d, 0.7258696564d, 0, -0.2585259868d, 0.5061949264d, -0.8227581726d, 0, 0.02136306781d, 0.5064016808d, -0.8620330371d, 0, 0.200111773d, + 0.8599263484d, 0.4695550591d, 0, 0.4743561372d, 0.6014985084d, -0.6427953014d, 0, 0.6622993731d, -0.5202474575d, -0.5391679918d, 0, 0.08084972818d, -0.6532720452d, 0.7527940996d, 0, + -0.6893687501d, 0.0592860349d, 0.7219805347d, 0, -0.1121887082d, -0.9673185067d, 0.2273952515d, 0, 0.7344116094d, 0.5979668656d, -0.3210532909d, 0, 0.5789393465d, -0.2488849713d, + 0.7764570201d, 0, 0.6988182827d, 0.3557169806d, -0.6205791146d, 0, -0.8636845529d, -0.2748771249d, -0.4224826141d, 0, -0.4247027957d, -0.4640880967d, 0.777335046d, 0, 0.5257722489d, + -0.8427017621d, 0.1158329937d, 0, 0.9343830603d, 0.316302472d, -0.1639543925d, 0, -0.1016836419d, -0.8057303073d, -0.5834887393d, 0, -0.6529238969d, 0.50602126d, -0.5635892736d, 0, + -0.2465286165d, -0.9668205684d, -0.06694497494d, 0, -0.9776897119d, -0.2099250524d, -0.007368825344d, 0, 0.7736893337d, 0.5734244712d, 0.2694238123d, 0, -0.6095087895d, 0.4995678998d, + 0.6155736747d, 0, 0.5794535482d, 0.7434546771d, 0.3339292269d, 0, -0.8226211154d, 0.08142581855d, 0.5627293636d, 0, -0.510385483d, 0.4703667658d, 0.7199039967d, 0, -0.5764971849d, + -0.07231656274d, -0.8138926898d, 0, 0.7250628871d, 0.3949971505d, -0.5641463116d, 0, -0.1525424005d, 0.4860840828d, -0.8604958341d, 0, -0.5550976208d, -0.4957820792d, 0.667882296d, 0, + -0.1883614327d, 0.9145869398d, 0.357841725d, 0, 0.7625556724d, -0.5414408243d, -0.3540489801d, 0, -0.5870231946d, -0.3226498013d, -0.7424963803d, 0, 0.3051124198d, 0.2262544068d, + -0.9250488391d, 0, 0.6379576059d, 0.577242424d, -0.5097070502d, 0, -0.5966775796d, 0.1454852398d, -0.7891830656d, 0, -0.658330573d, 0.6555487542d, -0.3699414651d, 0, 0.7434892426d, + 0.2351084581d, 0.6260573129d, 0, 0.5562114096d, 0.8264360377d, -0.0873632843d, 0, -0.3028940016d, -0.8251527185d, 0.4768419182d, 0, 0.1129343818d, -0.985888439d, -0.1235710781d, 0, + 0.5937652891d, -0.5896813806d, 0.5474656618d, 0, 0.6757964092d, -0.5835758614d, -0.4502648413d, 0, 0.7242302609d, -0.1152719764d, 0.6798550586d, 0, -0.9511914166d, 0.0753623979d, + -0.2992580792d, 0, 0.2539470961d, -0.1886339355d, 0.9486454084d, 0, 0.571433621d, -0.1679450851d, -0.8032795685d, 0, -0.06778234979d, 0.3978269256d, 0.9149531629d, 0, 0.6074972649d, + 0.733060024d, -0.3058922593d, 0, -0.5435478392d, 0.1675822484d, 0.8224791405d, 0, -0.5876678086d, -0.3380045064d, -0.7351186982d, 0, -0.7967562402d, 0.04097822706d, -0.6029098428d, 0, + -0.1996350917d, 0.8706294745d, 0.4496111079d, 0, -0.02787660336d, -0.9106232682d, -0.4122962022d, 0, -0.7797625996d, -0.6257634692d, 0.01975775581d, 0, -0.5211232846d, 0.7401644346d, + -0.4249554471d, 0, 0.8575424857d, 0.4053272873d, -0.3167501783d, 0, 0.1045223322d, 0.8390195772d, -0.5339674439d, 0, 0.3501822831d, 0.9242524096d, -0.1520850155d, 0, 0.1987849858d, + 0.07647613266d, 0.9770547224d, 0, 0.7845996363d, 0.6066256811d, -0.1280964233d, 0, 0.09006737436d, -0.9750989929d, -0.2026569073d, 0, -0.8274343547d, -0.542299559d, 0.1458203587d, 0, + -0.3485797732d, -0.415802277d, 0.840000362d, 0, -0.2471778936d, -0.7304819962d, -0.6366310879d, 0, -0.3700154943d, 0.8577948156d, 0.3567584454d, 0, 0.5913394901d, -0.548311967d, + -0.5913303597d, 0, 0.1204873514d, -0.7626472379d, -0.6354935001d, 0, 0.616959265d, 0.03079647928d, 0.7863922953d, 0, 0.1258156836d, -0.6640829889d, -0.7369967419d, 0, -0.6477565124d, + -0.1740147258d, -0.7417077429d, 0, 0.6217889313d, -0.7804430448d, -0.06547655076d, 0, 0.6589943422d, -0.6096987708d, 0.4404473475d, 0, -0.2689837504d, -0.6732403169d, -0.6887635427d, 0, + -0.3849775103d, 0.5676542638d, 0.7277093879d, 0, 0.5754444408d, 0.8110471154d, -0.1051963504d, 0, 0.9141593684d, 0.3832947817d, 0.131900567d, 0, -0.107925319d, 0.9245493968d, 0.3654593525d, 0, + 0.377977089d, 0.3043148782d, 0.8743716458d, 0, -0.2142885215d, -0.8259286236d, 0.5214617324d, 0, 0.5802544474d, 0.4148098596d, -0.7008834116d, 0, -0.1982660881d, 0.8567161266d, -0.4761596756d, + 0, -0.03381553704d, 0.3773180787d, -0.9254661404d, 0, -0.6867922841d, -0.6656597827d, 0.2919133642d, 0, 0.7731742607d, -0.2875793547d, -0.5652430251d, 0, -0.09655941928d, 0.9193708367d, + -0.3813575004d, 0, 0.2715702457d, -0.9577909544d, -0.09426605581d, 0, 0.2451015704d, -0.6917998565d, -0.6792188003d, 0, 0.977700782d, -0.1753855374d, 0.1155036542d, 0, -0.5224739938d, + 0.8521606816d, 0.02903615945d, 0, -0.7734880599d, -0.5261292347d, 0.3534179531d, 0, -0.7134492443d, -0.269547243d, 0.6467878011d, 0, 0.1644037271d, 0.5105846203d, -0.8439637196d, 0, + 0.6494635788d, 0.05585611296d, 0.7583384168d, 0, -0.4711970882d, 0.5017280509d, -0.7254255765d, 0, -0.6335764307d, -0.2381686273d, -0.7361091029d, 0, -0.9021533097d, -0.270947803d, + -0.3357181763d, 0, -0.3793711033d, 0.872258117d, 0.3086152025d, 0, -0.6855598966d, -0.3250143309d, 0.6514394162d, 0, 0.2900942212d, -0.7799057743d, -0.5546100667d, 0, -0.2098319339d, + 0.85037073d, 0.4825351604d, 0, -0.4592603758d, 0.6598504336d, -0.5947077538d, 0, 0.8715945488d, 0.09616365406d, -0.4807031248d, 0, -0.6776666319d, 0.7118504878d, -0.1844907016d, 0, + 0.7044377633d, 0.312427597d, 0.637304036d, 0, -0.7052318886d, -0.2401093292d, -0.6670798253d, 0, 0.081921007d, -0.7207336136d, -0.6883545647d, 0, -0.6993680906d, -0.5875763221d, + -0.4069869034d, 0, -0.1281454481d, 0.6419895885d, 0.7559286424d, 0, -0.6337388239d, -0.6785471501d, -0.3714146849d, 0, 0.5565051903d, -0.2168887573d, -0.8020356851d, 0, -0.5791554484d, + 0.7244372011d, -0.3738578718d, 0, 0.1175779076d, -0.7096451073d, 0.6946792478d, 0, -0.6134619607d, 0.1323631078d, 0.7785527795d, 0, 0.6984635305d, -0.02980516237d, -0.715024719d, 0, + 0.8318082963d, -0.3930171956d, 0.3919597455d, 0, 0.1469576422d, 0.05541651717d, -0.9875892167d, 0, 0.708868575d, -0.2690503865d, 0.6520101478d, 0, 0.2726053183d, 0.67369766d, -0.68688995d, 0, + -0.6591295371d, 0.3035458599d, -0.6880466294d, 0, 0.4815131379d, -0.7528270071d, 0.4487723203d, 0, 0.9430009463d, 0.1675647412d, -0.2875261255d, 0, 0.434802957d, 0.7695304522d, -0.4677277752d, + 0, 0.3931996188d, 0.594473625d, 0.7014236729d, 0, 0.7254336655d, -0.603925654d, 0.3301814672d, 0, 0.7590235227d, -0.6506083235d, 0.02433313207d, 0, -0.8552768592d, -0.3430042733d, + 0.3883935666d, 0, -0.6139746835d, 0.6981725247d, 0.3682257648d, 0, -0.7465905486d, -0.5752009504d, 0.3342849376d, 0, 0.5730065677d, 0.810555537d, -0.1210916791d, 0, -0.9225877367d, + -0.3475211012d, -0.167514036d, 0, -0.7105816789d, -0.4719692027d, -0.5218416899d, 0, -0.08564609717d, 0.3583001386d, 0.929669703d, 0, -0.8279697606d, -0.2043157126d, 0.5222271202d, 0, + 0.427944023d, 0.278165994d, 0.8599346446d, 0, 0.5399079671d, -0.7857120652d, -0.3019204161d, 0, 0.5678404253d, -0.5495413974d, -0.6128307303d, 0, -0.9896071041d, 0.1365639107d, + -0.04503418428d, 0, -0.6154342638d, -0.6440875597d, 0.4543037336d, 0, 0.1074204368d, -0.7946340692d, 0.5975094525d, 0, -0.3595449969d, -0.8885529948d, 0.28495784d, 0, -0.2180405296d, + 0.1529888965d, 0.9638738118d, 0, -0.7277432317d, -0.6164050508d, -0.3007234646d, 0, 0.7249729114d, -0.00669719484d, 0.6887448187d, 0, -0.5553659455d, -0.5336586252d, 0.6377908264d, 0, + 0.5137558015d, 0.7976208196d, -0.3160000073d, 0, -0.3794024848d, 0.9245608561d, -0.03522751494d, 0, 0.8229248658d, 0.2745365933d, -0.4974176556d, 0, -0.5404114394d, 0.6091141441d, + 0.5804613989d, 0, 0.8036581901d, -0.2703029469d, 0.5301601931d, 0, 0.6044318879d, 0.6832968393d, 0.4095943388d, 0, 0.06389988817d, 0.9658208605d, -0.2512108074d, 0, 0.1087113286d, + 0.7402471173d, -0.6634877936d, 0, -0.713427712d, -0.6926784018d, 0.1059128479d, 0, 0.6458897819d, -0.5724548511d, -0.5050958653d, 0, -0.6553931414d, 0.7381471625d, 0.159995615d, 0, + 0.3910961323d, 0.9188871375d, -0.05186755998d, 0, -0.4879022471d, -0.5904376907d, 0.6429111375d, 0, 0.6014790094d, 0.7707441366d, -0.2101820095d, 0, -0.5677173047d, 0.7511360995d, + 0.3368851762d, 0, 0.7858573506d, 0.226674665d, 0.5753666838d, 0, -0.4520345543d, -0.604222686d, -0.6561857263d, 0, 0.002272116345d, 0.4132844051d, -0.9105991643d, 0, -0.5815751419d, + -0.5162925989d, 0.6286591339d, 0, -0.03703704785d, 0.8273785755d, 0.5604221175d, 0, -0.5119692504d, 0.7953543429d, -0.3244980058d, 0, -0.2682417366d, -0.9572290247d, -0.1084387619d, 0, + -0.2322482736d, -0.9679131102d, -0.09594243324d, 0, 0.3554328906d, -0.8881505545d, 0.2913006227d, 0, 0.7346520519d, -0.4371373164d, 0.5188422971d, 0, 0.9985120116d, 0.04659011161d, + -0.02833944577d, 0, -0.3727687496d, -0.9082481361d, 0.1900757285d, 0, 0.91737377d, -0.3483642108d, 0.1925298489d, 0, 0.2714911074d, 0.4147529736d, -0.8684886582d, 0, 0.5131763485d, + -0.7116334161d, 0.4798207128d, 0, -0.8737353606d, 0.18886992d, -0.4482350644d, 0, 0.8460043821d, -0.3725217914d, 0.3814499973d, 0, 0.8978727456d, -0.1780209141d, -0.4026575304d, 0, + 0.2178065647d, -0.9698322841d, -0.1094789531d, 0, -0.1518031304d, -0.7788918132d, -0.6085091231d, 0, -0.2600384876d, -0.4755398075d, -0.8403819825d, 0, 0.572313509d, -0.7474340931d, + -0.3373418503d, 0, -0.7174141009d, 0.1699017182d, -0.6756111411d, 0, -0.684180784d, 0.02145707593d, -0.7289967412d, 0, -0.2007447902d, 0.06555605789d, -0.9774476623d, 0, -0.1148803697d, + -0.8044887315d, 0.5827524187d, 0, -0.7870349638d, 0.03447489231d, 0.6159443543d, 0, -0.2015596421d, 0.6859872284d, 0.6991389226d, 0, -0.08581082512d, -0.10920836d, -0.9903080513d, 0, + 0.5532693395d, 0.7325250401d, -0.396610771d, 0, -0.1842489331d, -0.9777375055d, -0.1004076743d, 0, 0.0775473789d, -0.9111505856d, 0.4047110257d, 0, 0.1399838409d, 0.7601631212d, + -0.6344734459d, 0, 0.4484419361d, -0.845289248d, 0.2904925424d, 0 }; + + private static final int PrimeX = 501125321; + private static final int PrimeY = 1136930381; + private static final int PrimeZ = 1720413743; + + public static class Vector2 { + public double x; + public double y; + + public Vector2(double x, double y) { + this.x = x; + this.y = y; + } + } + + public static class Vector3 { + public double x; + public double y; + public double z; + + public Vector3(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + } + + public enum NoiseType implements StringRepresentable { + OpenSimplex2("open_simplex_2"), + OpenSimplex2S("open_simplex_2s"), + Cellular("cellular"), + Perlin("perlin"), + ValueCubic("value_cubic"), + Value("value"); + + private final String name; + + NoiseType(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public enum RotationType3D implements StringRepresentable { + None("none"), + ImproveXYPlanes("improve_xy_planes"), + ImproveXZPlanes("improve_xz_planes"); + + private final String name; + + RotationType3D(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + private enum TransformType3D { + None, + ImproveXYPlanes, + ImproveXZPlanes, + DefaultOpenSimplex2 + }; + + public enum FractalType implements StringRepresentable { + None("none"), + FBm("fbm"), + Ridged("ridged"), + PingPong("ping_ping"); + + private final String name; + + FractalType(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public enum CellularDistanceFunction implements StringRepresentable { + Euclidean("euclidean"), + EuclideanSq("euclidean_sq"), + Manhattan("manhattan"), + Hybrid("hybrid"); + + private final String name; + + CellularDistanceFunction(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public enum CellularReturnType implements StringRepresentable { + CellValue("cell_value"), + Distance("distance"), + Distance2("distance_2"), + Distance2Add("distance_2_add"), + Distance2Sub("distance_2_sub"), + Distance2Mul("distance_2_mul"), + Distance2Div("distance_2_div"); + + private final String name; + + CellularReturnType(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public enum DomainWarpType implements StringRepresentable { + None("none"), + OpenSimplex2("open_simplex_2"), + OpenSimplex2Reduced("open_simplex_2_reduced"), + BasicGrid("basic_grid"); + + private final String name; + + DomainWarpType(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public enum DomainWarpFractalType implements StringRepresentable { + None("none"), + DomainWarpProgressive("domain_warp_progressive"), + DomainWarpIndependent("domain_warp_independent"); + + private final String name; + + DomainWarpFractalType(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return this.name; + } + }; + + public static class GeneralSettings { + private static ForgeConfigSpec.BooleanValue invertConfig; + private static ForgeConfigSpec.EnumValue noiseTypeConfig; + private static ForgeConfigSpec.EnumValue rotationType3DConfig; + private static ConfigValue seedOffsetConfig; + private static ConfigValue frequencyConfig; + + public static void config(ForgeConfigSpec.Builder builder) { + invertConfig = builder.comment("Inverted").define("oceanworlds.noise.general.invert", false); + noiseTypeConfig = builder.comment("Noise Type").defineEnum("oceanworlds.noise.general.noisetype", NoiseType.Perlin); + rotationType3DConfig = builder.comment("Rotation Type 3D").defineEnum("oceanworlds.noise.general.rotationtype", RotationType3D.ImproveXZPlanes); + seedOffsetConfig = builder.comment("Seed Offset").define("oceanworlds.noise.general.seedoffset", 0); + frequencyConfig = builder.comment("Frequency").define("oceanworlds.noise.general.frequency", 0.01D); + } + + public static GeneralSettings get() { + return new GeneralSettings(invertConfig.get(), noiseTypeConfig.get(), rotationType3DConfig.get(), seedOffsetConfig.get(), frequencyConfig.get()); + } + + private final boolean invert; + private final NoiseType noiseType; + private final RotationType3D rotationType3D; + private final TransformType3D transformTypeType3D; + private final long seedOffset; + private final double frequency; + + public GeneralSettings(boolean invert, NoiseType noiseType, RotationType3D rotationType3D, long seedOffset, double frequency) { + this.invert = invert; + this.noiseType = noiseType; + this.rotationType3D = rotationType3D; + this.seedOffset = seedOffset; + this.frequency = frequency; + + switch (rotationType3D) { + case ImproveXYPlanes: + transformTypeType3D = TransformType3D.ImproveXYPlanes; + break; + case ImproveXZPlanes: + transformTypeType3D = TransformType3D.ImproveXZPlanes; + break; + default: + switch (noiseType) { + case OpenSimplex2: + case OpenSimplex2S: + transformTypeType3D = TransformType3D.DefaultOpenSimplex2; + break; + default: + transformTypeType3D = TransformType3D.None; + break; + } + break; + } + } + + public boolean isInverted() { + return this.invert; + } + + public NoiseType getNoiseType() { + return this.noiseType; + } + + public RotationType3D getRotationType3D() { + return this.rotationType3D; + } + + public TransformType3D getTransformType3D() { + return this.transformTypeType3D; + } + + public long getSeedOffset() { + return this.seedOffset; + } + + public double getFrequency() { + return this.frequency; + } + + } + + public static class FractalSettings { + private static ForgeConfigSpec.EnumValue fractalTypeConfig; + private static ConfigValue octavesConfig; + private static ConfigValue lacunarityConfig; + private static ConfigValue gainConfig; + private static ConfigValue weightedStrengthConfig; + private static ConfigValue pingPongStrengthConfig; + + public static void config(ForgeConfigSpec.Builder builder) { + fractalTypeConfig = builder.comment("Fractal Type").defineEnum("oceanworlds.noise.fractal.fractaltype", FractalType.FBm); + octavesConfig = builder.comment("Octaves").define("oceanworlds.noise.fractal.octaves", 1); + lacunarityConfig = builder.comment("Lacunarity").define("oceanworlds.noise.fractal.lacunarity", 0.0D); + gainConfig = builder.comment("Gain").define("oceanworlds.noise.fractal.gain", 0.0D); + weightedStrengthConfig = builder.comment("Weighted Strength").define("oceanworlds.noise.fractal.weightedstrength", 0.0D); + pingPongStrengthConfig = builder.comment("Ping Pong Strength").define("oceanworlds.noise.fractal.pingpongstrength", 0.0D); + } + + public static FractalSettings get() { + return new FractalSettings(fractalTypeConfig.get(), octavesConfig.get(), lacunarityConfig.get(), gainConfig.get(), weightedStrengthConfig.get(), pingPongStrengthConfig.get()); + } + + private final FractalType fractalType; + private final int octaves; + private final double lacunarity; + private final double gain; + private final double weightedStrength; + private final double pingPongStrength; + private final double fractalBounding; + + public FractalSettings(FractalType fractalType, int octaves, double lacunarity, double gain, double weightedStrength, double pingPongStrength) { + this.fractalType = fractalType; + this.octaves = octaves; + this.lacunarity = lacunarity; + this.gain = gain; + this.weightedStrength = weightedStrength; + this.pingPongStrength = pingPongStrength; + + double amp = Math.abs(gain); + double ampFractal = 1.0f; + for (int i = 1; i < octaves; i++) { + ampFractal += amp; + amp *= Math.abs(gain); + } + this.fractalBounding = 1 / ampFractal; + } + + public FractalType getFractalType() { + return this.fractalType; + } + + public int getOctaves() { + return this.octaves; + } + + public double getLacunarity() { + return this.lacunarity; + } + + public double getGain() { + return this.gain; + } + + public double getWeightedStrength() { + return this.weightedStrength; + } + + public double getPingPongStrength() { + return this.pingPongStrength; + } + + public double getFractalBounding() { + return this.fractalBounding; + } + + } + + public static class CellularSettings { + private static ForgeConfigSpec.EnumValue distanceFunctionConfig; + private static ForgeConfigSpec.EnumValue returnTypeConfig; + private static ConfigValue jitterConfig; + + public static void config(ForgeConfigSpec.Builder builder) { + distanceFunctionConfig = builder.comment("Distance Function").defineEnum("oceanworlds.noise.cellular.distancefunction", CellularDistanceFunction.Euclidean); + returnTypeConfig = builder.comment("Return Type").defineEnum("oceanworlds.noise.cellular.returntype", CellularReturnType.CellValue); + jitterConfig = builder.comment("Lacunarity").define("oceanworlds.noise.cellular.jitter", 0.0D); + } + + public static CellularSettings get() { + return new CellularSettings(distanceFunctionConfig.get(), returnTypeConfig.get(), jitterConfig.get()); + } + + private final CellularDistanceFunction distanceFunction; + private final CellularReturnType returnType; + private final double jitter; + + public CellularSettings(CellularDistanceFunction distanceFunction, CellularReturnType returnType, double jitter) { + this.distanceFunction = distanceFunction; + this.returnType = returnType; + this.jitter = jitter; + } + + public CellularDistanceFunction getDistanceFunction() { + return this.distanceFunction; + } + + public CellularReturnType getReturnType() { + return this.returnType; + } + + public double getJitter() { + return this.jitter; + } + + } + + public static class DomainWarpSettings { + private static ForgeConfigSpec.EnumValue domainWarpTypeConfig; + private static ForgeConfigSpec.EnumValue rotationType3DConfig; + private static ConfigValue amplitudeConfig; + private static ConfigValue frequencyConfig; + private static ConfigValue octavesConfig; + private static ConfigValue gainConfig; + + public static void config(ForgeConfigSpec.Builder builder) { + domainWarpTypeConfig = builder.comment("Domain Warp Type").defineEnum("oceanworlds.noise.domainwarp.type", DomainWarpType.OpenSimplex2); + rotationType3DConfig = builder.comment("Rotation Type 3D").defineEnum("oceanworlds.noise.domainwarp.rotationtype", RotationType3D.None); + amplitudeConfig = builder.comment("Amplitude").define("oceanworlds.noise.domainwarp.amplitude", 30.0D); + frequencyConfig = builder.comment("Frequency").define("oceanworlds.noise.domainwarp.frequency", 0.01D); + octavesConfig = builder.comment("Octaves").define("oceanworlds.noise.domainwarp.octaves", 1); + gainConfig = builder.comment("Gain").define("oceanworlds.noise.domainwarp.gain", 0.0D); + } + + public static DomainWarpSettings get() { + return new DomainWarpSettings(domainWarpTypeConfig.get(), rotationType3DConfig.get(), amplitudeConfig.get(), frequencyConfig.get(), octavesConfig.get(), gainConfig.get()); + } + + private final DomainWarpType domainWarpType; + private final RotationType3D rotationType3D; + private final TransformType3D transformTypeType3D; + private final double amplitude; + private final double frequency; + private final int octaves; + private final double gain; + private final double fractalBounding; + + public DomainWarpSettings(DomainWarpType domainWarpType, RotationType3D rotationType3D, double amplitude, double frequency, int octaves, double gain) { + this.domainWarpType = domainWarpType; + this.rotationType3D = rotationType3D; + this.amplitude = amplitude; + this.frequency = frequency; + this.octaves = octaves; + this.gain = gain; + + double amp = Math.abs(this.gain); + double ampFractal = 1.0f; + for (int i = 1; i < this.octaves; i++) { + ampFractal += amp; + amp *= Math.abs(this.gain); + } + this.fractalBounding = 1 / ampFractal; + + switch (rotationType3D) { + case ImproveXYPlanes: + transformTypeType3D = TransformType3D.ImproveXYPlanes; + break; + case ImproveXZPlanes: + transformTypeType3D = TransformType3D.ImproveXZPlanes; + break; + default: + switch (domainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: + transformTypeType3D = TransformType3D.DefaultOpenSimplex2; + break; + default: + transformTypeType3D = TransformType3D.None; + break; + } + break; + } + } + + public DomainWarpType getDomainWarpType() { + return this.domainWarpType; + } + + public RotationType3D getRotationType3D() { + return this.rotationType3D; + } + + public TransformType3D getTransformType3D() { + return this.transformTypeType3D; + } + + public double getAmplitude() { + return this.amplitude; + } + + public double getFrequency() { + return this.frequency; + } + + public int getOctaves() { + return this.octaves; + } + + public double getGain() { + return this.gain; + } + + public double getFractalBounding() { + return this.fractalBounding; + } + + } + + public static class DomainWarpFractalSettings { + private static ForgeConfigSpec.EnumValue domainWarpTypeConfig; + private static ForgeConfigSpec.EnumValue domainWarpFractalTypeConfig; + private static ForgeConfigSpec.EnumValue rotationType3DConfig; + private static ConfigValue amplitudeConfig; + private static ConfigValue frequencyConfig; + private static ConfigValue octavesConfig; + private static ConfigValue lacunarityConfig; + private static ConfigValue gainConfig; + + public static void config(ForgeConfigSpec.Builder builder) { + domainWarpTypeConfig = builder.comment("Domain Warp Type").defineEnum("oceanworlds.noise.domainwarp.fractal.type", DomainWarpType.OpenSimplex2); + domainWarpFractalTypeConfig = builder.comment("Domain Warp Fractal Type").defineEnum("oceanworlds.noise.domainwarp.fractal.fractaltype", DomainWarpFractalType.None); + rotationType3DConfig = builder.comment("Rotation Type 3D").defineEnum("oceanworlds.noise.domainwarp.fractal.rotationtype", RotationType3D.ImproveXZPlanes); + amplitudeConfig = builder.comment("Amplitude").define("oceanworlds.noise.domainwarp.fractal.amplitude", 0.0D); + frequencyConfig = builder.comment("Frequency").define("oceanworlds.noise.domainwarp.fractal.frequency", 0.0D); + octavesConfig = builder.comment("Octaves").define("oceanworlds.noise.domainwarp.fractal.octaves", 1); + lacunarityConfig = builder.comment("Lacunarity").define("oceanworlds.noise.domainwarp.fractal.lacunarity", 0.0D); + gainConfig = builder.comment("Gain").define("oceanworlds.noise.domainwarp.fractal.gain", 0.0D); + } + + public static DomainWarpFractalSettings get() { + return new DomainWarpFractalSettings(domainWarpTypeConfig.get(), domainWarpFractalTypeConfig.get(), rotationType3DConfig.get(), amplitudeConfig.get(), frequencyConfig.get(), + octavesConfig.get(), lacunarityConfig.get(), gainConfig.get()); + } + + private final DomainWarpType domainWarpType; + private final DomainWarpFractalType domainWarpFractalType; + private final RotationType3D rotationType3D; + private final TransformType3D transformTypeType3D; + private final double amplitude; + private final double frequency; + private final int octaves; + private final double lacunarity; + private final double gain; + private final double fractalBounding; + + public DomainWarpFractalSettings(DomainWarpType domainWarpType, DomainWarpFractalType domainWarpFractalType, RotationType3D rotationType3D, double amplitude, double frequency, int octaves, + double lacunarity, double gain) { + this.domainWarpType = domainWarpType; + this.domainWarpFractalType = domainWarpFractalType; + this.rotationType3D = rotationType3D; + this.amplitude = amplitude; + this.frequency = frequency; + this.octaves = octaves; + this.lacunarity = lacunarity; + this.gain = gain; + + double amp = Math.abs(gain); + double ampFractal = 1.0f; + for (int i = 1; i < octaves; i++) { + ampFractal += amp; + amp *= Math.abs(gain); + } + this.fractalBounding = 1 / ampFractal; + + switch (rotationType3D) { + case ImproveXYPlanes: + transformTypeType3D = TransformType3D.ImproveXYPlanes; + break; + case ImproveXZPlanes: + transformTypeType3D = TransformType3D.ImproveXZPlanes; + break; + default: + switch (domainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: + transformTypeType3D = TransformType3D.DefaultOpenSimplex2; + break; + default: + transformTypeType3D = TransformType3D.None; + break; + } + break; + } + } + + public DomainWarpType getDomainWarpType() { + return this.domainWarpType; + } + + public DomainWarpFractalType getDomainWarpFractalType() { + return this.domainWarpFractalType; + } + + public RotationType3D getRotationType3D() { + return this.rotationType3D; + } + + public TransformType3D getTransformType3D() { + return this.transformTypeType3D; + } + + public double getAmplitude() { + return this.amplitude; + } + + public double getFrequency() { + return this.frequency; + } + + public int getOctaves() { + return this.octaves; + } + + public double getLacunarity() { + return this.lacunarity; + } + + public double getGain() { + return this.gain; + } + + public double getFractalBounding() { + return this.fractalBounding; + } + + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/config/OceanWorldsOptions.java b/src/main/java/org/infernalstudios/oceanworlds/config/OceanWorldsOptions.java new file mode 100644 index 0000000..6017e7a --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/config/OceanWorldsOptions.java @@ -0,0 +1,69 @@ +/** + * Copyright 2022 Infernal Studios + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.infernalstudios.oceanworlds.config; + +import java.io.File; + +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.CellularSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.DomainWarpFractalSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.DomainWarpSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.FractalSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.GeneralSettings; + +import com.electronwill.nightconfig.core.file.CommentedFileConfig; +import com.electronwill.nightconfig.core.io.WritingMode; + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.loading.FMLPaths; + +public class OceanWorldsOptions { + + private static final ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + private static ConfigValue oceanHeight; + private static ConfigValue oceanScale; + private static ForgeConfigSpec config; + + public static void init() { + builder.comment("Ocean Worlds"); + oceanHeight = builder.comment("Ocean Height").define("oceanworlds.height.ocean", 63); + oceanScale = builder.comment("Ocean Scale").define("oceanworlds.scale.ocean", 1); + + GeneralSettings.config(builder); + FractalSettings.config(builder); + CellularSettings.config(builder); + DomainWarpSettings.config(builder); + DomainWarpFractalSettings.config(builder); + + config = builder.build(); + + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, OceanWorldsOptions.config); + + CommentedFileConfig file = CommentedFileConfig.builder(new File(FMLPaths.CONFIGDIR.get().resolve("oceanworlds.toml").toString())).sync().autosave().writingMode(WritingMode.REPLACE).build(); + file.load(); + config.setConfig(file); + } + + public static int getOceanHeight() { + return oceanHeight.get(); + } + + public static int getOceanScale() { + return oceanScale.get(); + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/BoatMixin.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/BoatMixin.java new file mode 100644 index 0000000..04ba9d5 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/BoatMixin.java @@ -0,0 +1,107 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; + +@Mixin(Boat.class) +public abstract class BoatMixin extends Entity { + + @Shadow + private float invFriction; + @Shadow + private float outOfControlTicks; + @Shadow + private float deltaRotation; + @Shadow + private int lerpSteps; + @Shadow + private double lerpX; + @Shadow + private double lerpY; + @Shadow + private double lerpZ; + @Shadow + private double lerpYRot; + @Shadow + private double lerpXRot; + @Shadow + private boolean inputLeft; + @Shadow + private boolean inputRight; + @Shadow + private boolean inputUp; + @Shadow + private boolean inputDown; + @Shadow + private double waterLevel; + @Shadow + private float landFriction; + @Shadow + private Boat.Status status; + @Shadow + private Boat.Status oldStatus; + @Shadow + private double lastYd; + @Shadow + private boolean isAboveBubbleColumn; + @Shadow + private boolean bubbleColumnDirectionIsDown; + @Shadow + private float bubbleMultiplier; + @Shadow + private float bubbleAngle; + @Shadow + private float bubbleAngleO; + + public BoatMixin(EntityType p_19870_, Level p_19871_) { + super(p_19870_, p_19871_); + } + + @Inject(method = /* Whatever */ "float" /* Your */ + "Boat", at = @At("HEAD")) + private void oceanWorlds$floatBoat(CallbackInfo ci) { + if (this.status != Boat.Status.ON_LAND) { + AABB aabb = this.getBoundingBox(); + int i = Mth.floor(aabb.minX); + int j = Mth.ceil(aabb.maxX); + int k = Mth.floor(aabb.minY) - 1; + int l = Mth.ceil(aabb.minY + 0.001D) + 1; + int i1 = Mth.floor(aabb.minZ); + int j1 = Mth.ceil(aabb.maxZ); + this.waterLevel = -Double.MAX_VALUE; + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for (int k1 = i; k1 < j; ++k1) { + for (int l1 = k; l1 < l; ++l1) { + for (int i2 = i1; i2 < j1; ++i2) { + blockpos$mutableblockpos.set(k1, l1, i2); + FluidState fluidstate = this.level.getFluidState(blockpos$mutableblockpos); + if (fluidstate.is(FluidTags.WATER)) { + float f = (float) l1 + fluidstate.getHeight(this.level, blockpos$mutableblockpos); + this.waterLevel = Math.max((double) f, this.waterLevel); + } + } + } + } + if (this.waterLevel > -Double.MAX_VALUE) { + this.setPos(this.getX(), (this.waterLevel - this.getBbHeight()) + 0.101D, this.getZ()); + } + } + } + + @Shadow + public abstract float getWaterLevelAbove(); + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/ChunkStatusMixin.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/ChunkStatusMixin.java new file mode 100644 index 0000000..5967e1f --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/ChunkStatusMixin.java @@ -0,0 +1,93 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.Function; + +import org.infernalstudios.oceanworlds.OceanWorlds; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.CellularSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.DomainWarpFractalSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.DomainWarpSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.FractalSettings; +import org.infernalstudios.oceanworlds.config.FastNoiseSampler.GeneralSettings; +import org.infernalstudios.oceanworlds.config.OceanWorldsOptions; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.mojang.datafixers.util.Either; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ThreadedLevelLightEngine; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkStatus; + +@Mixin(ChunkStatus.class) +public class ChunkStatusMixin { + + @Inject(method = "lambda$static$12(Lnet/minecraft/world/level/chunk/ChunkStatus;Ljava/util/concurrent/Executor;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureManager;Lnet/minecraft/server/level/ThreadedLevelLightEngine;Ljava/util/function/Function;Ljava/util/List;Lnet/minecraft/world/level/chunk/ChunkAccess;Z)Ljava/util/concurrent/CompletableFuture;", at = @At(value = "RETURN", shift = Shift.BEFORE)) + private static void oceanWorlds$features(ChunkStatus chunkStatus, Executor executor, ServerLevel level, ChunkGenerator chunkGenerator, StructureManager structureManager, + ThreadedLevelLightEngine lightLevelEngine, Function>> f, List chunks, ChunkAccess chunk, + boolean b, CallbackInfoReturnable>> ci) { + if (chunkGenerator instanceof NoiseBasedChunkGeneratorAccessor noiseChunkGenerator) { + if (noiseChunkGenerator.getSettings().value().defaultFluid().getBlock() instanceof LiquidBlock liquid) { + if (level.dimension().equals(Level.OVERWORLD) || level.dimension().equals(Level.NETHER)) { + int height = OceanWorldsOptions.getOceanHeight(); + int scale = OceanWorldsOptions.getOceanScale(); + + BlockState defaultFluid = noiseChunkGenerator.getSettings().value().defaultFluid(); + WorldGenRegion worldgenregion = new WorldGenRegion(level, chunks, chunkStatus, 1); + + FastNoiseSampler noise = new FastNoiseSampler(GeneralSettings.get(), FractalSettings.get(), CellularSettings.get(), DomainWarpSettings.get(), DomainWarpFractalSettings.get()); + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + + BlockPos noisePos = chunk.getPos().getWorldPosition().offset(x, 0, z); + double extra = (noise.GetNoise(noisePos.getX(), noisePos.getZ(), worldgenregion.getSeed() ^ ~2) + 1) * scale; + + for (int y = chunk.getMinBuildHeight(); y <= height + (int) Math.ceil(extra); y++) { + + BlockPos pos = noisePos.above(y); + BlockState state = worldgenregion.getBlockState(pos); + + BlockState fluid = defaultFluid.is(Blocks.WATER) ? OceanWorlds.FALSE_WATER.get().defaultBlockState() : OceanWorlds.FALSE_LAVA.get().defaultBlockState(); + if ((y + 1) > height + Math.ceil(extra)) { + int val = 8 - (int) Math.floor((extra % 1) * 8.0D); + if (val < 8) { + fluid = fluid.setValue(LiquidBlock.LEVEL, val); + } else { + continue; + } + } + + if (state.is(Blocks.AIR) || ((FlowingFluidAccessor) liquid.getFluid()).callCanHoldFluid(worldgenregion, pos, state, liquid.getFluid()) + || state.is(defaultFluid.getBlock())) { + worldgenregion.setBlock(pos, fluid, Block.UPDATE_NONE, 0); + } else if (state.hasProperty(BlockStateProperties.WATERLOGGED)) { + worldgenregion.setBlock(pos, state.setValue(BlockStateProperties.WATERLOGGED, true), Block.UPDATE_NONE, 0); + } + } + } + } + } + } + } + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/FlowingFluidAccessor.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/FlowingFluidAccessor.java new file mode 100644 index 0000000..bc1e32c --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/FlowingFluidAccessor.java @@ -0,0 +1,18 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.Fluid; + +@Mixin(FlowingFluid.class) +public interface FlowingFluidAccessor { + + @Invoker + boolean callCanHoldFluid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid); + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockMixin.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockMixin.java new file mode 100644 index 0000000..12c018f --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockMixin.java @@ -0,0 +1,24 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import org.infernalstudios.oceanworlds.OceanWorlds; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; + +@Mixin(LiquidBlock.class) +public class LiquidBlockMixin { + + @Inject(method = "shouldSpreadLiquid", at = @At("HEAD"), cancellable = true) + private void oceanWorlds$shouldSpreadLiquid(Level level, BlockPos blockPos, BlockState blockState, CallbackInfoReturnable ci) { + if (level.getBlockState(blockPos).is(OceanWorlds.FALSE_WATER.get())) { + ci.setReturnValue(false); + } + } + +} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockRendererMixin.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockRendererMixin.java new file mode 100644 index 0000000..bcfcda9 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/LiquidBlockRendererMixin.java @@ -0,0 +1,8 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.client.renderer.block.LiquidBlockRenderer; + +@Mixin(LiquidBlockRenderer.class) +public abstract class LiquidBlockRendererMixin {} diff --git a/src/main/java/org/infernalstudios/oceanworlds/mixin/NoiseBasedChunkGeneratorAccessor.java b/src/main/java/org/infernalstudios/oceanworlds/mixin/NoiseBasedChunkGeneratorAccessor.java new file mode 100644 index 0000000..cf0d218 --- /dev/null +++ b/src/main/java/org/infernalstudios/oceanworlds/mixin/NoiseBasedChunkGeneratorAccessor.java @@ -0,0 +1,15 @@ +package org.infernalstudios.oceanworlds.merxmixin; + +import net.minecraft.core.Holder; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NoiseBasedChunkGenerator.class) +public interface NoiseBasedChunkGeneratorAccessor { + + @Accessor + Holder getSettings(); + +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..cccdfd6 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,28 @@ +modLoader="javafml" +loaderVersion="[36,)" +license="Apache-2.0" +[[mods]] +modId="oceanworlds" +version="${file.jarVersion}" +displayName="Ocean Worlds" +updateJSONURL="https://infernalstudios.org/api/mods/oceanworlds/forge" +logoFile="Ocean_Worlds_Banner.png" +authors="Infernal Studios" +description=''' +Ocean Worlds is a mod that raises the ocean level! + +Credits +LudoCrypt - Developer +''' +[[dependencies.oceanworlds]] + modId="forge" + mandatory=true + versionRange="[36,)" + ordering="NONE" + side="BOTH" +[[dependencies.oceanworlds]] + modId="minecraft" + mandatory=true + versionRange="[1.18,)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/Ocean_Worlds_Banner.png b/src/main/resources/Ocean_Worlds_Banner.png new file mode 100644 index 0000000..f6c4d09 Binary files /dev/null and b/src/main/resources/Ocean_Worlds_Banner.png differ diff --git a/src/main/resources/assets/oceanworlds/blockstates/false_lava.json b/src/main/resources/assets/oceanworlds/blockstates/false_lava.json new file mode 100644 index 0000000..54087c2 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/blockstates/false_lava.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/lava" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/oceanworlds/blockstates/false_water.json b/src/main/resources/assets/oceanworlds/blockstates/false_water.json new file mode 100644 index 0000000..99fd360 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/blockstates/false_water.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/water" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/oceanworlds/blockstates/full_water.json b/src/main/resources/assets/oceanworlds/blockstates/full_water.json new file mode 100644 index 0000000..ba82d24 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/blockstates/full_water.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "oceanworlds:block/water" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/oceanworlds/lang/en_us.json b/src/main/resources/assets/oceanworlds/lang/en_us.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/lang/en_us.json @@ -0,0 +1,2 @@ +{ +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height10.json b/src/main/resources/assets/oceanworlds/models/block/snow_height10.json new file mode 100644 index 0000000..dd72cc9 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height10.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 10, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 6, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 6, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 6, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 6, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height12.json b/src/main/resources/assets/oceanworlds/models/block/snow_height12.json new file mode 100644 index 0000000..bdce96c --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height12.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 12, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height14.json b/src/main/resources/assets/oceanworlds/models/block/snow_height14.json new file mode 100644 index 0000000..30e1d88 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height14.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 14, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 2, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 2, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 2, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 2, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height2.json b/src/main/resources/assets/oceanworlds/models/block/snow_height2.json new file mode 100644 index 0000000..de13fc6 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height2.json @@ -0,0 +1,19 @@ +{ "parent": "block/thin_block", + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 2, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 14, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 14, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 14, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 14, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height4.json b/src/main/resources/assets/oceanworlds/models/block/snow_height4.json new file mode 100644 index 0000000..650692c --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height4.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 4, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 12, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 12, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 12, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 12, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height6.json b/src/main/resources/assets/oceanworlds/models/block/snow_height6.json new file mode 100644 index 0000000..32468b9 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height6.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 10, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 10, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 10, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 10, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/snow_height8.json b/src/main/resources/assets/oceanworlds/models/block/snow_height8.json new file mode 100644 index 0000000..53d2282 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/snow_height8.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/snow", + "texture": "block/snow" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/oceanworlds/models/block/water.json b/src/main/resources/assets/oceanworlds/models/block/water.json new file mode 100644 index 0000000..7b6f7d6 --- /dev/null +++ b/src/main/resources/assets/oceanworlds/models/block/water.json @@ -0,0 +1,19 @@ +{ + "textures": { + "particle": "block/water_still", + "texture": "block/water_still" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/oceanworlds.mixins.json b/src/main/resources/oceanworlds.mixins.json new file mode 100644 index 0000000..10ff1a5 --- /dev/null +++ b/src/main/resources/oceanworlds.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "org.infernalstudios.oceanworlds.mixin", + "refmap": "oceanworlds.refmap.json", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..7674613 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Ocean Worlds", + "pack_format": 6 + } +}