diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index e354a3e5d6..f4b9172dd8 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1074,7 +1074,26 @@ public interface Client extends GameEngine RuneLiteObject createRuneLiteObject(); /** - * Loads a model from the cache + * Loads an unlit model from the cache. The returned model shares + * data such as faces, face colors, face transparencies, and vertex points with + * other models. If you want to mutate these you MUST call the relevant {@code cloneX} + * method. + * + * @see ModelData#cloneColors() + * + * @param id the ID of the model + * @return the model or null if it is loading or nonexistent + */ + @Nullable + ModelData loadModelData(int id); + + ModelData mergeModels(ModelData[] models, int length); + ModelData mergeModels(ModelData ...models); + + /** + * Loads and lights a model from the cache + * + * This is equivalent to {@code loadModelData(id).light()} * * @param id the ID of the model * @return the model or null if it is loading or nonexistent diff --git a/runelite-api/src/main/java/net/runelite/api/Mesh.java b/runelite-api/src/main/java/net/runelite/api/Mesh.java new file mode 100644 index 0000000000..33241b4357 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/Mesh.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * A {@link Model} or {@link ModelData} + */ +public interface Mesh> +{ + int getVerticesCount(); + int[] getVerticesX(); + int[] getVerticesY(); + int[] getVerticesZ(); + + int getFaceCount(); + int[] getFaceIndices1(); + int[] getFaceIndices2(); + int[] getFaceIndices3(); + byte[] getFaceTransparencies(); + short[] getFaceTextures(); + + /** + * Rotates this model 90 degrees around the vertical axis. + * {@link ModelData#cloneVertices()} should be called before calling this method + */ + T rotateY90Ccw(); + + /** + * Rotates this model 180 degrees around the vertical axis. + * {@link ModelData#cloneVertices()} should be called before calling this method + */ + T rotateY180Ccw(); + + /** + * Rotates this model 270 degrees around the vertical axis. + * {@link ModelData#cloneVertices()} should be called before calling this method + */ + T rotateY270Ccw(); + + /** + * Offsets this model by the passed amount (1/128ths of a tile). + * {@link ModelData#cloneVertices()} should be called before calling this method + */ + T translate(int x, int y, int z); + + /** + * Resizes this model by the passed amount (1/128ths). + * {@link ModelData#cloneVertices()} should be called before calling this method + */ + T scale(int x, int y, int z); +} diff --git a/runelite-api/src/main/java/net/runelite/api/Model.java b/runelite-api/src/main/java/net/runelite/api/Model.java index 03045dac2c..1316d31055 100644 --- a/runelite-api/src/main/java/net/runelite/api/Model.java +++ b/runelite-api/src/main/java/net/runelite/api/Model.java @@ -27,32 +27,14 @@ package net.runelite.api; /** * Represents the model of an object. */ -public interface Model extends Renderable +public interface Model extends Mesh, Renderable { - int getVerticesCount(); - - int[] getVerticesX(); - - int[] getVerticesY(); - - int[] getVerticesZ(); - - int getFaceCount(); - - int[] getFaceIndices1(); - - int[] getFaceIndices2(); - - int[] getFaceIndices3(); - int[] getFaceColors1(); int[] getFaceColors2(); int[] getFaceColors3(); - byte[] getFaceTransparencies(); - int getSceneId(); void setSceneId(int sceneId); @@ -70,8 +52,6 @@ public interface Model extends Renderable int getRadius(); - short[] getFaceTextures(); - float[] getFaceTextureUVCoordinates(); void calculateExtreme(int orientation); diff --git a/runelite-api/src/main/java/net/runelite/api/ModelData.java b/runelite-api/src/main/java/net/runelite/api/ModelData.java new file mode 100644 index 0000000000..f98da89ca8 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ModelData.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2022 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * An unlit model + */ +public interface ModelData extends Mesh, Renderable +{ + int DEFAULT_AMBIENT = 64; + int DEFAULT_CONTRAST = 768; + int DEFAULT_X = -50; + int DEFAULT_Y = -10; + int DEFAULT_Z = -50; + + /** + * Gets colors as Jagex HSL + * + * @see JagexColor + */ + short[] getFaceColors(); + + /** + * Lights a model. + * + * The produced model shares verticies, face transparencies, face indicies, and textures with + * the underlying ModelData. If any of these may be mutated the corresponding {@code cloneX} + * method should be called before {@code light}ing + */ + Model light(int ambient, int contrast, int x, int y, int z); + + /** + * Lights a model with default values + * + * @see #light(int, int, int, int, int) + */ + Model light(); + + /** + * Applies a recolor using Jagex's HSL format. You should call {@link #cloneColors()} ()} before calling + * this method + */ + ModelData recolor(short colorToReplace, short colorToReplaceWith); + + /** + * Applies a retexture, changing texture ids. You should call {@link #cloneTextures()} before calling + * this method + */ + ModelData retexture(short find, short replace); + + /** + * Shallow-copies a model. Does not copy any arrays, which are still shared with this object. + */ + ModelData shallowCopy(); + + /** + * Clones {@link #getVerticesX()}, {@link #getVerticesY()}, and {@link #getVerticesZ()} so + * they can be safely mutated + */ + ModelData cloneVertices(); + + /** + * Clones {@link #getFaceColors()} so they can be safely mutated + */ + ModelData cloneColors(); + + /** + * Clones {@link #getFaceTextures()} so they can be safely mutated + */ + ModelData cloneTextures(); + + /** + * Clones {@link #getFaceTransparencies()} so they can be safely mutated + */ + ModelData cloneTransparencies(); +}