mirror of
https://github.com/haselkern/Minecraft-ArmorStand.git
synced 2025-05-17 15:05:33 +00:00
261 lines
No EOL
6.9 KiB
JavaScript
261 lines
No EOL
6.9 KiB
JavaScript
// BIG Thanks to tutsplus.com
|
|
// http://code.tutsplus.com/tutorials/webgl-with-threejs-basics--net-35688
|
|
// for helping me getting started
|
|
|
|
//Stuff for rendering
|
|
var DEG2RAD = Math.PI / 180;
|
|
var width, height, renderer, scene, camera;
|
|
var clock = new THREE.Clock;
|
|
var rotY = 0, rotX = 0;
|
|
var matWood = new THREE.MeshLambertMaterial({ color: 0x826841 });
|
|
//var matWood = new THREE.MeshLambertMaterial({ color: 0x826841, transparent: true, opacity: 0.5 }); //For testing the mesh alignment
|
|
var matStone = new THREE.MeshLambertMaterial({ color: 0xadadad });
|
|
var viewCenter = new THREE.Vector3(0,0,0);
|
|
// Meshes
|
|
// The ones marked with //* are not real meshes, but contain a child (or more) which gets rendered.
|
|
// This is done, so these can easily be rotated around an accurate pivot point.
|
|
var mBasePlate;
|
|
var mBody; //*
|
|
var mHead; //*
|
|
var mLegLeft; //*
|
|
var mLegRight; //*
|
|
var mArmLeft; //*
|
|
var mArmRight; //*
|
|
var armorstand, armorstandWrapper; //Group all the other elements
|
|
|
|
|
|
//DATA -> Stuff that we'll use to generate the command. Fetched from the controls.
|
|
var invisible = false;
|
|
var invulnerable = false;
|
|
var noBasePlate = false;
|
|
var noGravity = false;
|
|
var showArms = false;
|
|
var small = false;
|
|
var head = new THREE.Vector3(0,0,0);
|
|
var body = new THREE.Vector3(0,0,0);
|
|
var leftLeg = new THREE.Vector3(0,0,0);
|
|
var rightLeg = new THREE.Vector3(0,0,0);
|
|
var leftArm = new THREE.Vector3(0,0,0);
|
|
var rightarm = new THREE.Vector3(0,0,0);
|
|
|
|
//Stuff for mouse movements
|
|
var mouseDownX;
|
|
var mouseDownY;
|
|
var mouseMoveX;
|
|
var mouseMoveY;
|
|
var mouseRotationMultiplier = 0.008;
|
|
//A point class will help us manage the mouse movements.
|
|
Point = {
|
|
x:null,
|
|
y:null
|
|
};
|
|
|
|
$(document).ready(function(){
|
|
setup();
|
|
updateUI();
|
|
render();
|
|
|
|
$("input").on("input", function(){
|
|
handleInput();
|
|
});
|
|
$(':checkbox').change(function() {
|
|
handleInput();
|
|
});
|
|
|
|
$("#gl")
|
|
.mousedown(function(event){
|
|
mouseDownX = event.pageX;
|
|
mouseDownY = event.pageY;
|
|
})
|
|
.mousemove(function(event){
|
|
mouseMoveX = event.pageX;
|
|
mouseMoveY = event.pageY;
|
|
})
|
|
.mouseup(function(event){
|
|
rotY += getMouseDeltaX();
|
|
rotX += getMouseDeltaY();
|
|
mouseDownX = null;
|
|
mouseDownY = null;
|
|
});
|
|
});
|
|
|
|
function setup(){
|
|
width = $("#gl").width();
|
|
height = $("#gl").height();
|
|
|
|
renderer = new THREE.WebGLRenderer({ antialias: true, alpha:true });
|
|
renderer.setSize(width, height);
|
|
$("#gl").append(renderer.domElement);
|
|
|
|
|
|
scene = new THREE.Scene();
|
|
armorstand = new THREE.Object3D();
|
|
|
|
|
|
|
|
//BasePlate
|
|
mBasePlate = new THREE.Mesh(
|
|
new THREE.CubeGeometry(12/16, 1/16, 12/16),
|
|
matStone);
|
|
mBasePlate.position.y = -1/32;
|
|
//Add a little dot to the BasePlate, so the user knows which way is forward
|
|
mmBaseDot = new THREE.Mesh(
|
|
new THREE.CubeGeometry(4/16, 1/16, 4/16),
|
|
matStone);
|
|
mmBaseDot.position.set(0,0,8/16);
|
|
mBasePlate.add(mmBaseDot);
|
|
armorstand.add(mBasePlate);
|
|
|
|
// To Generate the other body parts, we will use a mesh to display,
|
|
// and add it as a child to the object that serves as a pivot.
|
|
|
|
//Left Leg
|
|
var mmLegLeft = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 11/16, 2/16),
|
|
matWood);
|
|
mmLegLeft.position.set(0,-5.5/16,0);
|
|
mLegLeft = new THREE.Object3D();
|
|
mLegLeft.position.set(2/16,11/16,0); //Pivot Point
|
|
mLegLeft.add(mmLegLeft);
|
|
armorstand.add(mLegLeft);
|
|
|
|
//Right Leg
|
|
var mmLegRight = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 11/16, 2/16),
|
|
matWood);
|
|
mmLegRight.position.set(0,-5.5/16,0);
|
|
mLegRight = new THREE.Object3D();
|
|
mLegRight.position.set(-2/16,11/16,0); //Pivot Point
|
|
mLegRight.add(mmLegRight);
|
|
armorstand.add(mLegRight);
|
|
|
|
//Left Arm
|
|
var mmArmLeft = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 12/16, 2/16),
|
|
matWood);
|
|
mmArmLeft.position.set(0,-4/16,0);
|
|
mArmLeft = new THREE.Object3D();
|
|
mArmLeft.position.set(6/16,21/16,0); //Pivot Point
|
|
mArmLeft.add(mmArmLeft);
|
|
armorstand.add(mArmLeft);
|
|
|
|
//Right Arm
|
|
var mmArmRight = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 12/16, 2/16),
|
|
matWood);
|
|
mmArmRight.position.set(0,-4/16,0);
|
|
mArmRight = new THREE.Object3D();
|
|
mArmRight.position.set(-6/16,21/16,0); //Pivot Point
|
|
mArmRight.add(mmArmRight);
|
|
armorstand.add(mArmRight);
|
|
|
|
//Body (consists of four parts)
|
|
var mmHip = new THREE.Mesh(
|
|
new THREE.CubeGeometry(8/16, 2/16, 2/16),
|
|
matWood);
|
|
mmHip.position.set(0,-11/16,0);
|
|
var mmBodyLeft = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 7/16, 2/16),
|
|
matWood);
|
|
mmBodyLeft.position.set(2/16,-6.5/16,0);
|
|
var mmBodyRight = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 7/16, 2/16),
|
|
matWood);
|
|
mmBodyRight.position.set(-2/16,-6.5/16,0);
|
|
var mmShoulders = new THREE.Mesh(
|
|
new THREE.CubeGeometry(12/16, 3/16, 3/16),
|
|
matWood);
|
|
mmShoulders.position.set(0,-1.5/16,0);
|
|
mBody = new THREE.Object3D();
|
|
mBody.position.set(0,23/16,0); //Pivot Point
|
|
mBody.add(mmHip);
|
|
mBody.add(mmBodyLeft);
|
|
mBody.add(mmBodyRight);
|
|
mBody.add(mmShoulders);
|
|
armorstand.add(mBody);
|
|
|
|
//Head (neck and skull)
|
|
var mmNeck = new THREE.Mesh(
|
|
new THREE.CubeGeometry(2/16, 7/16, 2/16),
|
|
matWood);
|
|
mmNeck.position.set(0,3.5/16,0);
|
|
/*
|
|
We do not want the head, as it obstructs a whole lot of the view. We can implement this,
|
|
once we've got an editor option to toggle it on and off.
|
|
var mmSkull = new THREE.Mesh(
|
|
new THREE.CubeGeometry(10/16, 10/16, 10/16),
|
|
matWood);
|
|
mmSkull.position.set(0,5/16,0);*/
|
|
mHead = new THREE.Object3D();
|
|
mHead.position.set(0,22/16,0); //Pivot Point
|
|
mHead.add(mmNeck);
|
|
armorstand.add(mHead);
|
|
|
|
//Add an armorstandwrapper to the scene, so the armorstand can be rotated naturally.
|
|
armorstandWrapper = new THREE.Object3D();
|
|
armorstand.position.set(0,-0.5,0);
|
|
armorstandWrapper.add(armorstand);
|
|
scene.add(armorstandWrapper);
|
|
|
|
camera = new THREE.PerspectiveCamera(45, width/height, 0.1, 1000);
|
|
camera.position.y = 2;
|
|
camera.position.z = 4;
|
|
camera.lookAt(viewCenter);
|
|
scene.add(camera);
|
|
|
|
var pointLight = new THREE.PointLight(0xffffff);
|
|
pointLight.position.set(0, 300, 200);
|
|
|
|
scene.add(pointLight);
|
|
}
|
|
|
|
function handleInput(){
|
|
|
|
invisible = getCheckBox("invisible");
|
|
invulnerable = getCheckBox("invulnerable");
|
|
noBasePlate = getCheckBox("nobaseplate");
|
|
noGravity = getCheckBox("nogravity");
|
|
showArms = getCheckBox("showarms");
|
|
small = getCheckBox("small");
|
|
|
|
|
|
updateUI();
|
|
}
|
|
function getCheckBox(name){
|
|
return $("input[name="+name+"]").prop("checked");
|
|
}
|
|
|
|
/** Changes stuff according to our input values */
|
|
function updateUI(){
|
|
//Hide/Show the arm section
|
|
if(showArms)
|
|
$("#inputarms").show();
|
|
else
|
|
$("#inputarms").hide();
|
|
}
|
|
|
|
function getMouseDeltaX(){
|
|
var mouseDeltaX = 0;
|
|
if(mouseDownX != null && mouseMoveX != null){
|
|
mouseDeltaX = mouseMoveX - mouseDownX;
|
|
}
|
|
return mouseDeltaX * mouseRotationMultiplier;
|
|
}
|
|
function getMouseDeltaY(){
|
|
var mouseDeltaY = 0;
|
|
if(mouseDownY != null && mouseMoveY != null){
|
|
mouseDeltaY = mouseMoveY - mouseDownY;
|
|
}
|
|
return mouseDeltaY * mouseRotationMultiplier;
|
|
}
|
|
|
|
function render(){
|
|
renderer.render(scene, camera);
|
|
|
|
var deltaTime = clock.getDelta();
|
|
|
|
armorstandWrapper.rotation.y = rotY + getMouseDeltaX();
|
|
armorstandWrapper.rotation.x = rotX + getMouseDeltaY();
|
|
|
|
requestAnimationFrame(render);
|
|
} |