Groundwork for character editor menu
This commit is contained in:
parent
9b91154983
commit
61ea9733fc
@ -59,7 +59,16 @@
|
||||
"INVENTORY",
|
||||
"OUTLINE"
|
||||
],
|
||||
"visualAttributes" : [],
|
||||
"visualAttributes" : [
|
||||
{
|
||||
"attributeId" : "TorsoHeight",
|
||||
"type" : "bone",
|
||||
"subtype" : "scalez",
|
||||
"primaryBone" : "Bone",
|
||||
"minValue" : 0.8,
|
||||
"maxValue" : 1.2
|
||||
}
|
||||
],
|
||||
"movementSystems" : [
|
||||
{
|
||||
"type" : "GROUND",
|
||||
@ -262,7 +271,7 @@
|
||||
"maxHealth" : 100,
|
||||
"onDamageIFrames" : 30
|
||||
},
|
||||
"modelPath" : "Models/baseman4.fbx"
|
||||
"modelPath" : "Models/baseman5.fbx"
|
||||
}
|
||||
],
|
||||
"files" : []
|
||||
|
||||
BIN
assets/Models/baseman5.fbx
Normal file
BIN
assets/Models/baseman5.fbx
Normal file
Binary file not shown.
@ -25,7 +25,9 @@ import electrosphere.menu.MenuGenerators;
|
||||
import electrosphere.renderer.ui.Window;
|
||||
import electrosphere.renderer.ui.events.ClickEvent;
|
||||
import electrosphere.renderer.ui.events.KeyboardEvent;
|
||||
import electrosphere.renderer.ui.events.MenuEvent;
|
||||
import electrosphere.renderer.ui.events.MouseEvent;
|
||||
import electrosphere.renderer.ui.events.MenuEvent.MenuEventType;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
@ -66,6 +68,8 @@ public class ControlHandler {
|
||||
public static final String INPUT_CODE_CHARACTER_OPEN = "characterOpen";
|
||||
public static final String INPUT_CODE_IRON_SIGHT = "ironSight";
|
||||
|
||||
public static final String DATA_STRING_INPUT_CODE_MENU_NAVIGATE_FORWARD = "menuNavigateForward";
|
||||
public static final String DATA_STRING_INPUT_CODE_MENU_NAVIGATE_BACKWARDS = "menuNavigateBackwards";
|
||||
public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement";
|
||||
public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement";
|
||||
public static final String DATA_STRING_INPUT_CODE_MENU_SELECT = "menuSelect";
|
||||
@ -191,8 +195,10 @@ public class ControlHandler {
|
||||
/*
|
||||
Map the menu navigation controls
|
||||
*/
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_INCREMENT, new Control(ControlType.KEY,GLFW_KEY_DOWN));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_DECREMENT, new Control(ControlType.KEY,GLFW_KEY_UP));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_FORWARD, new Control(ControlType.KEY,GLFW_KEY_DOWN));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_BACKWARDS, new Control(ControlType.KEY,GLFW_KEY_UP));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_INCREMENT, new Control(ControlType.KEY,GLFW_KEY_RIGHT));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_DECREMENT, new Control(ControlType.KEY,GLFW_KEY_LEFT));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_SELECT, new Control(ControlType.KEY,GLFW_KEY_ENTER));
|
||||
handler.addControl(DATA_STRING_INPUT_CODE_MENU_BACKOUT, new Control(ControlType.KEY,GLFW_KEY_ESCAPE));
|
||||
handler.addControl(INPUT_CODE_MENU_MOUSE_PRIMARY, new Control(ControlType.MOUSE_BUTTON,GLFW_MOUSE_BUTTON_LEFT));
|
||||
@ -788,18 +794,62 @@ public class ControlHandler {
|
||||
}
|
||||
|
||||
void setMenuNavigationControls(){
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_FORWARD));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_FORWARD).setOnPress(new ControlMethod(){public void execute(){
|
||||
// Globals.currentMenu.incrementMenuOption();
|
||||
Globals.elementManager.focusNextElement();
|
||||
}});
|
||||
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_BACKWARDS));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_NAVIGATE_BACKWARDS).setOnPress(new ControlMethod(){public void execute(){
|
||||
// Globals.currentMenu.decrementMenuOption();
|
||||
Globals.elementManager.focusPreviousElement();
|
||||
}});
|
||||
|
||||
|
||||
|
||||
//Incrementing a menu element
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.INCREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnRepeat(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.INCREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setRepeatTimeout(0.5f * Main.targetFrameRate);
|
||||
|
||||
|
||||
|
||||
|
||||
//Decrementing a menu element
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.DECREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnRepeat(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.DECREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setRepeatTimeout(0.5f * Main.targetFrameRate);
|
||||
|
||||
|
||||
|
||||
|
||||
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT).setOnPress(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.click(new ClickEvent(
|
||||
|
||||
@ -50,6 +50,7 @@ import electrosphere.net.server.player.Player;
|
||||
import electrosphere.renderer.Model;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorBoneRotator;
|
||||
import electrosphere.renderer.actor.ActorStaticMorph;
|
||||
import electrosphere.renderer.actor.ActorUtils;
|
||||
import electrosphere.renderer.light.PointLight;
|
||||
import electrosphere.util.ModelLoader;
|
||||
@ -289,15 +290,30 @@ public class CreatureUtils {
|
||||
}
|
||||
//variants
|
||||
if(rawType.getVisualAttributes() != null){
|
||||
ActorStaticMorph staticMorph = null;
|
||||
for(VisualAttribute attributeType : rawType.getVisualAttributes()){
|
||||
if(attributeType.getVariants() != null && attributeType.getVariants().size() > 0){
|
||||
AttributeVariant variant = attributeType.getVariants().get(0);
|
||||
// attributeType.getAttributeId();
|
||||
// variant.getId();
|
||||
rVal.putData(EntityDataStrings.CREATURE_ATTRIBUTE_VARIANT + attributeType.getAttributeId(), variant.getId());
|
||||
Globals.assetManager.addModelPathToQueue(variant.getModel());
|
||||
for(String mesh : variant.getMeshes()){
|
||||
creatureActor.getMeshMask().queueMesh(variant.getModel(), mesh);
|
||||
if(attributeType.getType().equals("remesh")){
|
||||
if(attributeType.getVariants() != null && attributeType.getVariants().size() > 0){
|
||||
AttributeVariant variant = attributeType.getVariants().get(0);
|
||||
// attributeType.getAttributeId();
|
||||
// variant.getId();
|
||||
rVal.putData(EntityDataStrings.CREATURE_ATTRIBUTE_VARIANT + attributeType.getAttributeId(), variant.getId());
|
||||
Globals.assetManager.addModelPathToQueue(variant.getModel());
|
||||
for(String mesh : variant.getMeshes()){
|
||||
creatureActor.getMeshMask().queueMesh(variant.getModel(), mesh);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(attributeType.getType().equals("bone")){
|
||||
if(staticMorph == null){
|
||||
staticMorph = new ActorStaticMorph();
|
||||
creatureActor.setActorStaticMorph(staticMorph);
|
||||
}
|
||||
if(attributeType.getPrimaryBone() != null && staticMorph.getBoneTransforms(attributeType.getPrimaryBone()) == null){
|
||||
staticMorph.initBoneTransforms(attributeType.getPrimaryBone());
|
||||
}
|
||||
if(attributeType.getMirrorBone() != null && staticMorph.getBoneTransforms(attributeType.getMirrorBone()) == null){
|
||||
staticMorph.initBoneTransforms(attributeType.getMirrorBone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,13 +3,46 @@ package electrosphere.game.data.creature.type.visualattribute;
|
||||
import java.util.List;
|
||||
|
||||
public class VisualAttribute {
|
||||
|
||||
|
||||
String attributeId;
|
||||
String type; //remesh or bone
|
||||
String subtype; //if bone: yaw,pitch,roll,scalex,scaley,scalez,offx,offy,offz,offl
|
||||
//offl = length offset, scaling along the offset from the previous bone (as if to elongate a limb)
|
||||
List<AttributeVariant> variants;
|
||||
float minValue;
|
||||
float maxValue;
|
||||
String primaryBone;
|
||||
String mirrorBone;
|
||||
|
||||
public String getAttributeId(){
|
||||
return attributeId;
|
||||
}
|
||||
|
||||
public String getType(){
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getSubtype(){
|
||||
return subtype;
|
||||
}
|
||||
|
||||
public float getMinValue(){
|
||||
return minValue;
|
||||
}
|
||||
|
||||
public float getMaxValue(){
|
||||
return maxValue;
|
||||
}
|
||||
|
||||
public String getPrimaryBone(){
|
||||
return primaryBone;
|
||||
}
|
||||
|
||||
public String getMirrorBone(){
|
||||
return mirrorBone;
|
||||
}
|
||||
|
||||
public List<AttributeVariant> getVariants(){
|
||||
return variants;
|
||||
}
|
||||
|
||||
@ -4,19 +4,25 @@ import electrosphere.controls.ControlHandler.ControlsState;
|
||||
import electrosphere.engine.LoadingThread;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityDataStrings;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.gravity.GravityUtils;
|
||||
import electrosphere.entity.state.gravity.GravityTree.GravityTreeState;
|
||||
import electrosphere.entity.state.inventory.InventoryUtils;
|
||||
import electrosphere.entity.state.inventory.RelationalInventoryState;
|
||||
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.data.creature.type.CreatureType;
|
||||
import electrosphere.game.data.creature.type.visualattribute.VisualAttribute;
|
||||
import electrosphere.game.server.saves.SaveUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.NetUtils;
|
||||
import electrosphere.renderer.Model;
|
||||
import electrosphere.renderer.RenderingEngine;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorStaticMorph;
|
||||
import electrosphere.renderer.ui.ClickableElement;
|
||||
import electrosphere.renderer.ui.DrawableElement;
|
||||
import electrosphere.renderer.ui.Element;
|
||||
@ -625,9 +631,20 @@ public class MenuGenerators {
|
||||
return false;
|
||||
}});
|
||||
|
||||
for(int i = 0; i < 6; i++){
|
||||
//pull up character editor
|
||||
Button characterSliderMenuButton = new Button();
|
||||
Label characterSliderMenuLabel = new Label(100,650,fontSize);
|
||||
characterSliderMenuLabel.setText("Character slider menu");
|
||||
characterSliderMenuButton.addChild(characterSliderMenuLabel);
|
||||
scrollable.addChild(characterSliderMenuButton);
|
||||
characterSliderMenuButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
|
||||
WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameCharacterSliderMenu());
|
||||
return false;
|
||||
}});
|
||||
|
||||
for(int i = 0; i < 5; i++){
|
||||
Button someButton = new Button();
|
||||
Label someLabel = new Label(100,650 + i * 100,fontSize);
|
||||
Label someLabel = new Label(100,750 + i * 100,fontSize);
|
||||
someLabel.setText("aaaaaa" + i);
|
||||
someButton.addChild(someLabel);
|
||||
scrollable.addChild(someButton);
|
||||
@ -700,6 +717,123 @@ public class MenuGenerators {
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static Window createInGameCharacterSliderMenu(){
|
||||
int width = 500;
|
||||
int height = 500;
|
||||
float fontSize = 0.4f;
|
||||
Window rVal = new Window(0,0,width,height);
|
||||
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
|
||||
// Div div = new Div();
|
||||
// div.setPositionX(0);
|
||||
// div.setPositionY(0);
|
||||
// div.setWidth(500);
|
||||
// div.setHeight(500);
|
||||
ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height);
|
||||
rVal.addChild(scrollable);
|
||||
// scrollable.addChild(div);
|
||||
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
|
||||
WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu());
|
||||
return false;
|
||||
}});
|
||||
|
||||
//black texture background
|
||||
ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture);
|
||||
// imagePanel.setWidth(width);
|
||||
// imagePanel.setHeight(height);
|
||||
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
|
||||
scrollable.addChild(imagePanel);
|
||||
|
||||
//label 1 (back)
|
||||
Button backButton = new Button();
|
||||
Label backLabel = new Label(200,50,fontSize);
|
||||
backLabel.setText("Back");
|
||||
backButton.addChild(backLabel);
|
||||
scrollable.addChild(backButton);
|
||||
backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
|
||||
WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu());
|
||||
return false;
|
||||
}});
|
||||
|
||||
Entity playerEntity = Globals.playerEntity;
|
||||
Actor playerActor = EntityUtils.getActor(playerEntity);
|
||||
ActorStaticMorph staticMorph = playerActor.getStaticMorph();
|
||||
CreatureType playeCreatureType = Globals.gameConfigCurrent.getCreatureTypeLoader().getCreature(CreatureUtils.getType(playerEntity));
|
||||
int offset = 0;
|
||||
for(VisualAttribute attribute : playeCreatureType.getVisualAttributes()){
|
||||
int posY = offset * 350 + 100;
|
||||
if(attribute.getType().equals("bone")){
|
||||
Slider attributeSlider = new Slider(50,posY,400,100,new Vector3f(0.1f,0.1f,0.1f),new Vector3f(1.0f,0,0));
|
||||
attributeSlider.setOnValueChange(new Slider.OnSliderChangeCallback() {public void onChange(float value) {
|
||||
float minVal = attribute.getMinValue();
|
||||
float range = attribute.getMaxValue() - minVal;
|
||||
float actualValue = minVal + range * value;
|
||||
switch(attribute.getSubtype()){
|
||||
case "yaw":
|
||||
staticMorph.setYaw(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setYaw(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "pitch":
|
||||
staticMorph.setPitch(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setPitch(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "roll":
|
||||
staticMorph.setRoll(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setRoll(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "scalex":
|
||||
staticMorph.setScaleX(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setScaleX(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "scaley":
|
||||
staticMorph.setScaleY(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setScaleY(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "scalez":
|
||||
staticMorph.setScaleZ(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setScaleZ(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "offx":
|
||||
staticMorph.setOffsetX(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setOffsetX(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "offy":
|
||||
staticMorph.setOffsetY(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setOffsetY(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "offz":
|
||||
staticMorph.setOffsetZ(attribute.getPrimaryBone(), actualValue);
|
||||
if(attribute.getMirrorBone() != null){
|
||||
staticMorph.setOffsetZ(attribute.getMirrorBone(), -actualValue);
|
||||
}
|
||||
break;
|
||||
case "offl":
|
||||
//TODO
|
||||
break;
|
||||
}
|
||||
}});
|
||||
scrollable.addChild(attributeSlider);
|
||||
}
|
||||
}
|
||||
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){
|
||||
int width = 500;
|
||||
int height = 500;
|
||||
@ -856,7 +990,6 @@ public class MenuGenerators {
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static Window createCharacterMenu(RelationalInventoryState inventory){
|
||||
// int screenTop = Globals.WINDOW_HEIGHT - 150;
|
||||
int width = 500;
|
||||
|
||||
@ -4,6 +4,7 @@ import electrosphere.renderer.actor.ActorAnimationMask;
|
||||
import electrosphere.renderer.actor.ActorBoneRotator;
|
||||
import electrosphere.renderer.actor.ActorMeshMask;
|
||||
import electrosphere.renderer.actor.ActorShaderMask;
|
||||
import electrosphere.renderer.actor.ActorStaticMorph;
|
||||
import electrosphere.renderer.actor.ActorTextureMask;
|
||||
import electrosphere.renderer.anim.AnimChannel;
|
||||
import electrosphere.renderer.anim.Animation;
|
||||
@ -371,13 +372,13 @@ public class Model {
|
||||
return node_object;
|
||||
}
|
||||
|
||||
public void updateNodeTransform(Map<String,ActorBoneRotator> boneRotators){
|
||||
public void updateNodeTransform(Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
||||
if(this.root_anim_node != null){
|
||||
update_node_transform(this.root_anim_node,boneRotators);
|
||||
update_node_transform(this.root_anim_node,boneRotators,staticMorph);
|
||||
}
|
||||
}
|
||||
|
||||
void update_node_transform(AnimNode n, Map<String,ActorBoneRotator> boneRotators){
|
||||
void update_node_transform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
||||
if(n.parent != null){
|
||||
n.transform = new Matrix4f(n.parent.transform);
|
||||
} else {
|
||||
@ -397,7 +398,11 @@ public class Model {
|
||||
if(boneRotators.containsKey(target_bone.boneID)){
|
||||
n.transform.rotate(boneRotators.get(target_bone.boneID).getRotation());
|
||||
}
|
||||
Matrix4f bone_matrix = new Matrix4f(n.transform).mul(target_bone.inverseBindPoseMatrix);
|
||||
Matrix4f bone_matrix = new Matrix4f(n.transform);
|
||||
if(staticMorph != null && staticMorph.getBoneTransforms(n.id) != null){
|
||||
bone_matrix.mul(staticMorph.getBoneTransforms(n.id).getTransform());
|
||||
}
|
||||
bone_matrix.mul(target_bone.inverseBindPoseMatrix);
|
||||
bone_matrix = new Matrix4f(globalInverseTransform).mul(bone_matrix);
|
||||
target_bone.final_transform = bone_matrix;
|
||||
// if(!toggled){
|
||||
@ -419,7 +424,7 @@ public class Model {
|
||||
Iterator<AnimNode> node_iterator = n.children.iterator();
|
||||
while(node_iterator.hasNext()){
|
||||
AnimNode current_node = node_iterator.next();
|
||||
update_node_transform(current_node,boneRotators);
|
||||
update_node_transform(current_node,boneRotators,staticMorph);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -30,6 +30,7 @@ public class Actor {
|
||||
List<ActorShaderMask> shaderMasks = new LinkedList<ActorShaderMask>();
|
||||
Map<String,ActorTextureMask> textureMap = null;
|
||||
Map<String,ActorBoneRotator> boneRotators = new HashMap<String,ActorBoneRotator>();
|
||||
ActorStaticMorph staticMorph;
|
||||
|
||||
public Actor(String modelPath){
|
||||
this.modelPath = modelPath;
|
||||
@ -162,7 +163,7 @@ public class Actor {
|
||||
}
|
||||
|
||||
void calculateNodeTransforms(Model model){
|
||||
model.updateNodeTransform(boneRotators);
|
||||
model.updateNodeTransform(boneRotators,staticMorph);
|
||||
}
|
||||
|
||||
// public boolean isPlayingAnimation(){
|
||||
@ -356,5 +357,13 @@ public class Actor {
|
||||
return boneRotators.get(bone);
|
||||
}
|
||||
|
||||
public void setActorStaticMorph(ActorStaticMorph staticMorph){
|
||||
this.staticMorph = staticMorph;
|
||||
}
|
||||
|
||||
public ActorStaticMorph getStaticMorph(){
|
||||
return this.staticMorph;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
105
src/main/java/electrosphere/renderer/actor/ActorStaticMorph.java
Normal file
105
src/main/java/electrosphere/renderer/actor/ActorStaticMorph.java
Normal file
@ -0,0 +1,105 @@
|
||||
package electrosphere.renderer.actor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.joml.Matrix4f;
|
||||
import org.joml.Quaternionf;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
public class ActorStaticMorph {
|
||||
|
||||
Map<String,StaticMorphTransforms> boneTransformMap = new HashMap<String,StaticMorphTransforms>();
|
||||
|
||||
public void initBoneTransforms(String boneName){
|
||||
boneTransformMap.put(boneName, new StaticMorphTransforms());
|
||||
}
|
||||
|
||||
public StaticMorphTransforms getBoneTransforms(String boneName){
|
||||
return boneTransformMap.get(boneName);
|
||||
}
|
||||
|
||||
public void setYaw(String boneName, float yaw){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).yaw = yaw;
|
||||
}
|
||||
}
|
||||
|
||||
public void setPitch(String boneName, float pitch){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).pitch = pitch;
|
||||
}
|
||||
}
|
||||
|
||||
public void setRoll(String boneName, float roll){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).roll = roll;
|
||||
}
|
||||
}
|
||||
|
||||
public void setOffsetX(String boneName, float offsetX){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).offset.x = offsetX;
|
||||
}
|
||||
}
|
||||
|
||||
public void setOffsetY(String boneName, float offsetY){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).offset.y = offsetY;
|
||||
}
|
||||
}
|
||||
|
||||
public void setOffsetZ(String boneName, float offsetZ){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).offset.z = offsetZ;
|
||||
}
|
||||
}
|
||||
|
||||
public void setScaleX(String boneName, float scaleX){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).scale.x = scaleX;
|
||||
}
|
||||
}
|
||||
|
||||
public void setScaleY(String boneName, float scaleY){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).scale.y = scaleY;
|
||||
}
|
||||
}
|
||||
|
||||
public void setScaleZ(String boneName, float scaleZ){
|
||||
if(boneTransformMap.containsKey(boneName)){
|
||||
boneTransformMap.get(boneName).scale.z = scaleZ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class StaticMorphTransforms {
|
||||
|
||||
float yaw = 0.0f;
|
||||
float pitch = 0.0f;
|
||||
float roll = 0.0f;
|
||||
Vector3f offset = new Vector3f(0,0,0);
|
||||
Vector3f scale = new Vector3f(1,1,1);
|
||||
|
||||
public Quaternionf getRotation(){
|
||||
return new Quaternionf().rotateXYZ(yaw, pitch, roll);
|
||||
}
|
||||
|
||||
public Vector3f getOffset(){
|
||||
return offset;
|
||||
}
|
||||
|
||||
public Vector3f getScale(){
|
||||
return scale;
|
||||
}
|
||||
|
||||
public Matrix4f getTransform(){
|
||||
Matrix4f rVal = new Matrix4f();
|
||||
rVal.translationRotateScale(offset, getRotation(), scale);
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -27,5 +27,10 @@ public class ActorUtils {
|
||||
EntityUtils.getRotation(actorEntity).rotateLocalX((float)-Math.PI/2);
|
||||
}
|
||||
|
||||
public static ActorStaticMorph getStaticMorph(Entity actorEntity){
|
||||
Actor entityActor = EntityUtils.getActor(actorEntity);
|
||||
return entityActor.getStaticMorph();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
package electrosphere.renderer.ui;
|
||||
|
||||
import electrosphere.renderer.ui.events.MenuEvent;
|
||||
|
||||
public interface MenuEventElement extends Element {
|
||||
|
||||
public void setOnMenuEventCallback(MenuEventCallback callback);
|
||||
|
||||
public abstract interface MenuEventCallback {
|
||||
|
||||
public boolean execute(MenuEvent event);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -10,15 +10,17 @@ import electrosphere.renderer.ui.DraggableElement;
|
||||
import electrosphere.renderer.ui.DrawableElement;
|
||||
import electrosphere.renderer.ui.FocusableElement;
|
||||
import electrosphere.renderer.ui.KeyEventElement;
|
||||
import electrosphere.renderer.ui.MenuEventElement;
|
||||
import electrosphere.renderer.ui.events.ClickEvent;
|
||||
import electrosphere.renderer.ui.events.DragEvent;
|
||||
import electrosphere.renderer.ui.events.Event;
|
||||
import electrosphere.renderer.ui.events.FocusEvent;
|
||||
import electrosphere.renderer.ui.events.KeyboardEvent;
|
||||
import electrosphere.renderer.ui.events.MenuEvent;
|
||||
import electrosphere.renderer.ui.events.MouseEvent;
|
||||
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
|
||||
|
||||
public class Slider implements ClickableElement, DraggableElement, FocusableElement, DrawableElement, KeyEventElement {
|
||||
public class Slider implements ClickableElement, DraggableElement, FocusableElement, DrawableElement, MenuEventElement {
|
||||
|
||||
public int width = 1;
|
||||
public int height = 1;
|
||||
@ -34,11 +36,12 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
boolean focused = false;
|
||||
FocusEventCallback onFocusCallback;
|
||||
FocusEventCallback onLoseFocusCallback;
|
||||
KeyboardEventCallback onKeyPressCallback;
|
||||
DragEventCallback onDragStart;
|
||||
DragEventCallback onDrag;
|
||||
DragEventCallback onDragRelease;
|
||||
ClickEventCallback onClick;
|
||||
MenuEventCallback onMenuEvent;
|
||||
OnSliderChangeCallback onChangeValue;
|
||||
|
||||
float min = 0.0f;
|
||||
float max = 1.0f;
|
||||
@ -210,11 +213,6 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
onLoseFocusCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOnPress(KeyboardEventCallback callback) {
|
||||
onKeyPressCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOnDragStart(DragEventCallback callback) {
|
||||
this.onDragStart = callback;
|
||||
@ -235,6 +233,15 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
this.onClick = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOnMenuEventCallback(MenuEventCallback callback) {
|
||||
onMenuEvent = callback;
|
||||
}
|
||||
|
||||
public void setOnValueChange(OnSliderChangeCallback callback){
|
||||
this.onChangeValue = callback;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean handleEvent(Event event) {
|
||||
@ -256,13 +263,28 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
propagate = true;
|
||||
}
|
||||
}
|
||||
} else if(event instanceof KeyboardEvent){
|
||||
KeyboardEvent keyEvent = (KeyboardEvent)event;
|
||||
if(onKeyPressCallback != null){
|
||||
propagate = onKeyPressCallback.execute(keyEvent);
|
||||
} else if(event instanceof MenuEvent){
|
||||
MenuEvent menuEvent = (MenuEvent) event;
|
||||
if(onMenuEvent != null){
|
||||
onMenuEvent.execute(menuEvent);
|
||||
} else {
|
||||
//default behavior
|
||||
propagate = true;
|
||||
switch(menuEvent.getType()){
|
||||
case INCREMENT:
|
||||
value = Math.min(value + ((max - min) * 0.01f),max);
|
||||
if(onChangeValue != null){
|
||||
onChangeValue.onChange(value);
|
||||
}
|
||||
propagate = false;
|
||||
break;
|
||||
case DECREMENT:
|
||||
value = Math.max(value - ((max - min) * 0.01f),min);
|
||||
if(onChangeValue != null){
|
||||
onChangeValue.onChange(value);
|
||||
}
|
||||
propagate = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if(event instanceof DragEvent){
|
||||
DragEvent dragEvent = (DragEvent) event;
|
||||
@ -298,6 +320,9 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
int percentage = clickEvent.getCurrentX() - positionX;
|
||||
int max = width;
|
||||
value = Math.max(Math.min((float)percentage/max,1.0f),0.0f);
|
||||
if(onChangeValue != null){
|
||||
onChangeValue.onChange(value);
|
||||
}
|
||||
propagate = false;
|
||||
}
|
||||
}
|
||||
@ -305,4 +330,11 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
|
||||
return propagate;
|
||||
}
|
||||
|
||||
|
||||
public interface OnSliderChangeCallback {
|
||||
|
||||
public void onChange(float value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
package electrosphere.renderer.ui.events;
|
||||
|
||||
public class MenuEvent implements Event {
|
||||
|
||||
public static enum MenuEventType {
|
||||
INCREMENT,
|
||||
DECREMENT,
|
||||
}
|
||||
|
||||
MenuEventType type;
|
||||
|
||||
public MenuEvent(MenuEventType type){
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public MenuEventType getType(){
|
||||
return type;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user