Repe [T3DU] Update - 31f26d171bba0355ce2a77031e3aad4c64dbc7e9
This commit is contained in:
@ -1,31 +1,119 @@
|
||||
package iron.object;
|
||||
|
||||
import iron.data.SceneFormat;
|
||||
import iron.math.Vec4;
|
||||
import iron.math.Quat;
|
||||
|
||||
class Constraint {
|
||||
var raw: TConstraint;
|
||||
var target: Transform = null;
|
||||
|
||||
public function new(constr: TConstraint) {
|
||||
raw = constr;
|
||||
public function new(constraint: TConstraint) {
|
||||
raw = constraint;
|
||||
}
|
||||
|
||||
public function apply(transform: Transform) {
|
||||
if (target == null && raw.target != null) target = Scene.active.getChild(raw.target).transform;
|
||||
|
||||
if (target == null && raw.type != "LIMIT_LOCATION" && raw.type != "LIMIT_ROTATION" && raw.type != "LIMIT_SCALE") return;
|
||||
|
||||
if (raw.type == "COPY_LOCATION") {
|
||||
if (raw.use_x) {
|
||||
transform.world._30 = target.loc.x;
|
||||
if (raw.use_offset) transform.world._30 += transform.loc.x;
|
||||
if (raw.use_offset) {
|
||||
if (raw.use_x) transform.world._30 += target.world._30;
|
||||
if (raw.use_y) transform.world._31 += target.world._31;
|
||||
if (raw.use_z) transform.world._32 += target.world._32;
|
||||
}
|
||||
if (raw.use_y) {
|
||||
transform.world._31 = target.loc.y;
|
||||
if (raw.use_offset) transform.world._31 += transform.loc.y;
|
||||
else {
|
||||
if (raw.use_x) transform.world._30 = target.world._30;
|
||||
if (raw.use_y) transform.world._31 = target.world._31;
|
||||
if (raw.use_z) transform.world._32 = target.world._32;
|
||||
}
|
||||
if (raw.use_z) {
|
||||
transform.world._32 = target.loc.z;
|
||||
if (raw.use_offset) transform.world._32 += transform.loc.z;
|
||||
}
|
||||
|
||||
else if (raw.type == "COPY_ROTATION") {
|
||||
var tq = target.rot;
|
||||
var mq = transform.rot;
|
||||
if (raw.use_offset) {
|
||||
mq.mult(tq);
|
||||
}
|
||||
else {
|
||||
if (raw.use_x) mq.x = tq.x;
|
||||
if (raw.use_y) mq.y = tq.y;
|
||||
if (raw.use_z) mq.z = tq.z;
|
||||
mq.w = tq.w;
|
||||
}
|
||||
var loc = new Vec4(transform.world._30, transform.world._31, transform.world._32);
|
||||
var scale = transform.scale;
|
||||
transform.world.compose(loc, mq, scale);
|
||||
}
|
||||
|
||||
else if (raw.type == "COPY_SCALE") {
|
||||
var ts = target.scale;
|
||||
if (raw.use_offset) {
|
||||
if (raw.use_x) transform.scale.x *= ts.x;
|
||||
if (raw.use_y) transform.scale.y *= ts.y;
|
||||
if (raw.use_z) transform.scale.z *= ts.z;
|
||||
}
|
||||
else {
|
||||
if (raw.use_x) transform.scale.x = ts.x;
|
||||
if (raw.use_y) transform.scale.y = ts.y;
|
||||
if (raw.use_z) transform.scale.z = ts.z;
|
||||
}
|
||||
var loc = new Vec4(transform.world._30, transform.world._31, transform.world._32);
|
||||
transform.world.compose(loc, transform.rot, transform.scale);
|
||||
}
|
||||
|
||||
else if (raw.type == "COPY_TRANSFORMS") {
|
||||
transform.world.setFrom(target.world);
|
||||
}
|
||||
|
||||
else if (raw.type == "LIMIT_LOCATION") {
|
||||
if (raw.use_min_x && transform.world._30 < raw.min_x) transform.world._30 = raw.min_x;
|
||||
if (raw.use_max_x && transform.world._30 > raw.max_x) transform.world._30 = raw.max_x;
|
||||
|
||||
if (raw.use_min_y && transform.world._31 < raw.min_y) transform.world._31 = raw.min_y;
|
||||
if (raw.use_max_y && transform.world._31 > raw.max_y) transform.world._31 = raw.max_y;
|
||||
|
||||
if (raw.use_min_z && transform.world._32 < raw.min_z) transform.world._32 = raw.min_z;
|
||||
if (raw.use_max_z && transform.world._32 > raw.max_z) transform.world._32 = raw.max_z;
|
||||
}
|
||||
|
||||
else if (raw.type == "LIMIT_ROTATION") {
|
||||
var euler = transform.rot.getEuler();
|
||||
var changed = false;
|
||||
|
||||
if (raw.use_limit_x) {
|
||||
if (euler.x < raw.min_x) { euler.x = raw.min_x; changed = true; }
|
||||
if (euler.x > raw.max_x) { euler.x = raw.max_x; changed = true; }
|
||||
}
|
||||
if (raw.use_limit_y) {
|
||||
if (euler.y < raw.min_y) { euler.y = raw.min_y; changed = true; }
|
||||
if (euler.y > raw.max_y) { euler.y = raw.max_y; changed = true; }
|
||||
}
|
||||
if (raw.use_limit_z) {
|
||||
if (euler.z < raw.min_z) { euler.z = raw.min_z; changed = true; }
|
||||
if (euler.z > raw.max_z) { euler.z = raw.max_z; changed = true; }
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
transform.rot.fromEuler(euler.x, euler.y, euler.z);
|
||||
var loc = new Vec4(transform.world._30, transform.world._31, transform.world._32);
|
||||
transform.world.compose(loc, transform.rot, transform.scale);
|
||||
}
|
||||
}
|
||||
|
||||
else if (raw.type == "LIMIT_SCALE") {
|
||||
if (raw.use_min_x && transform.scale.x < raw.min_x) transform.scale.x = raw.min_x;
|
||||
if (raw.use_max_x && transform.scale.x > raw.max_x) transform.scale.x = raw.max_x;
|
||||
|
||||
if (raw.use_min_y && transform.scale.y < raw.min_y) transform.scale.y = raw.min_y;
|
||||
if (raw.use_max_y && transform.scale.y > raw.max_y) transform.scale.y = raw.max_y;
|
||||
|
||||
if (raw.use_min_z && transform.scale.z < raw.min_z) transform.scale.z = raw.min_z;
|
||||
if (raw.use_max_z && transform.scale.z > raw.max_z) transform.scale.z = raw.max_z;
|
||||
|
||||
var loc = new Vec4(transform.world._30, transform.world._31, transform.world._32);
|
||||
transform.world.compose(loc, transform.rot, transform.scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user