rl-api: expose ModelData & model transformation methods

This commit is contained in:
Max Weber
2022-01-18 14:46:54 -07:00
parent 85b15156fc
commit 6555643e11
4 changed files with 192 additions and 22 deletions

View File

@@ -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

View File

@@ -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<T extends Mesh<T>>
{
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);
}

View File

@@ -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);

View File

@@ -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<ModelData>, 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();
}