whisper.cat/weboasis/arcade/chess/js/geoPieces.js
2023-10-05 23:28:32 +11:00

279 lines
8.6 KiB
JavaScript

// ECMAScript 5 strict mode
/* jshint globalstrict: true*/
/* global THREE,console,BLACK,WHITE,WIREFRAME */
"use strict";
var pieceMaterial = [];
pieceMaterial[BLACK] = new THREE.MeshPhongMaterial({color:0x111111,specular:0xaaaaaa,shininess:30.0,wireframe:WIREFRAME});
pieceMaterial[WHITE] = new THREE.MeshPhongMaterial({color:0xdddddd,wireframe:WIREFRAME});
function createPawn(size,color) {
var pawn = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.6;
var body = new THREE.Mesh(
new THREE.SphereGeometry(bodyRadius,32,16),pieceMaterial[color]);
body.position.y = baseHeight + bodyRadius;
var neckHeight = size;
var neckRadius = bodyRadius*0.7;
var neck = new THREE.Mesh(
new THREE.CylinderGeometry(0,neckRadius,neckHeight,32,1),pieceMaterial[color]);
neck.position.y = baseHeight + bodyRadius*2+neckHeight/2;
var headRadius = size*0.2;
var head = new THREE.Mesh(
new THREE.SphereGeometry(headRadius,32,16),pieceMaterial[color]);
head.position.y = baseHeight + bodyRadius*2 +neckHeight+headRadius/2;
pawn.add(head);
pawn.add(neck);
pawn.add(body);
pawn.add(base);
pawn.name = "Pawn";
return pawn;
}
function createRook(size,color) {
var rook = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.4;
var bodyHeight = size*1.6;
var body = new THREE.Mesh(
new THREE.CylinderGeometry(bodyRadius*1.2,bodyRadius,bodyHeight,32,16),pieceMaterial[color]);
body.position.y = baseHeight + bodyHeight/2;
var wedgeHeight = size*0.5;
var wedgeRadius = bodyRadius * 1.5;
var wedge = new THREE.Mesh(
new THREE.CylinderGeometry(wedgeRadius,bodyRadius*1.2,wedgeHeight,32,1),pieceMaterial[color]);
wedge.position.y = baseHeight + bodyHeight+wedgeHeight/2;
var teethThickness = size*0.2;
var teethHeight = wedgeHeight;
var teethTilt = size*0.1;
var obr = wedgeRadius;
var ibr = wedgeRadius-teethThickness;
var otr = obr-teethTilt;
var itr = ibr-teethTilt;
var teethCount = 6;
var subdivision = Math.round(32/(teethCount*2));
var teethGeo = new THREE.TubeGeometry(otr,obr,itr,ibr,teethHeight,subdivision,1,0,2*Math.PI/(teethCount*2));
for (var i = 0; i < teethCount; i++) {
var teeth = new THREE.Mesh(teethGeo,pieceMaterial[color]);
teeth.position.y = baseHeight+bodyHeight+wedgeHeight+teethHeight/2;
teeth.rotation.y = i*2*Math.PI/teethCount;
rook.add(teeth);
}
rook.add(wedge);
rook.add(body);
rook.add(base);
rook.name = "Rook";
return rook;
}
function createKnight(size,color) {
var knight = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.6;
var body = new THREE.Mesh(
new THREE.SphereGeometry(bodyRadius,32,16),pieceMaterial[color]);
var neckHeight = size*1.2;
var neckBottomRadius = bodyRadius*0.6;
var neckTopRadius = bodyRadius*0.0;
var _neck = new THREE.Mesh(
new THREE.CylinderGeometry(neckTopRadius,neckBottomRadius,neckHeight,32,1),pieceMaterial[color]);
_neck.position.y = bodyRadius+neckHeight/2;
var neck = new THREE.Object3D();
neck.add(_neck);
neck.rotation.z = -Math.PI/32;
var head = new THREE.Object3D();
var skullRadius = size*0.6;
var skull = new THREE.Mesh(
new THREE.SphereGeometry(skullRadius,32,16),pieceMaterial[color]);
var faceHeight = size*1.0;
var faceBottomRadius = skullRadius*0.8;
var faceTopRadius = skullRadius*0.3;
var face = new THREE.Mesh(
new THREE.CylinderGeometry(faceTopRadius,faceBottomRadius,faceHeight,32,1),pieceMaterial[color]);
face.rotation.z = Math.PI/16;
face.position.y = skullRadius;
var noseRadius = size*0.2;
var nose = new THREE.Mesh(
new THREE.SphereGeometry(noseRadius,32,16),pieceMaterial[color]);
nose.position.y = skullRadius +faceHeight+noseRadius/2;
head.add(skull);
head.add(face);
//head.add(nose);
head.scale.z = 0.5;
head.rotation.z = 5*Math.PI/8;
head.position.y = bodyRadius+neckHeight;
var horse = new THREE.Object3D();
horse.add(body);
horse.add(neck);
horse.add(head);
horse.rotation.z = -Math.PI/32;
horse.rotation.y = (color == whiteMat) ? -Math.PI/2 : Math.PI/2;
horse.position.y = baseHeight+bodyRadius;
knight.add(horse);
knight.add(base);
knight.name = "Knight";
return knight;
}
function createBishop(size,color) {
var bishop = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.6;
var body = new THREE.Mesh(
new THREE.SphereGeometry(bodyRadius,32,16),pieceMaterial[color]);
body.position.y = baseHeight + bodyRadius;
var neckHeight = size*1.7;
var neckBottomRadius = bodyRadius*0.3;
var neckTopRadius = bodyRadius*0.05;
var neck = new THREE.Mesh(
new THREE.CylinderGeometry(neckTopRadius,neckBottomRadius,neckHeight,32,1),pieceMaterial[color]);
neck.position.y = baseHeight + bodyRadius*2+neckHeight/2;
var headRadius = size*0.2;
var head = new THREE.Mesh(
new THREE.SphereGeometry(headRadius,32,16),pieceMaterial[color]);
head.scale.y = 1.5;
head.position.y = baseHeight + bodyRadius*2 +neckHeight+headRadius/2;
bishop.add(head);
bishop.add(neck);
bishop.add(body);
bishop.add(base);
bishop.name = "Bishop";
return bishop;
}
function createQueen(size,color) {
var queen = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.6;
var body = new THREE.Mesh(
new THREE.SphereGeometry(bodyRadius,32,16),pieceMaterial[color]);
body.position.y = baseHeight + bodyRadius;
var neckHeight = size*2.3;
var neckBottomRadius = bodyRadius*0.3;
var neckTopRadius = bodyRadius*0.05;
var neck = new THREE.Mesh(
new THREE.CylinderGeometry(neckTopRadius,neckBottomRadius,neckHeight,32,1),pieceMaterial[color]);
neck.position.y = baseHeight + bodyRadius*2+neckHeight/2;
var collarHeight = size* 0.1;
var collarRadius = size* 0.4;
var collar = new THREE.Mesh(
new THREE.CylinderGeometry(collarRadius,collarRadius,collarHeight,32,1),pieceMaterial[color]);
collar.position.y = baseHeight+bodyRadius*2+neckHeight - size*0.1;
var headRadius = size*0.2;
var head = new THREE.Mesh(
new THREE.SphereGeometry(headRadius,32,16),pieceMaterial[color]);
head.position.y = baseHeight + bodyRadius*2 +neckHeight+headRadius/2;
queen.add(head);
queen.add(collar);
queen.add(neck);
queen.add(body);
queen.add(base);
queen.name = "Queen";
return queen;
}
function createKing(size,color) {
var king = new THREE.Object3D();
var baseHeight = size*0.1;
var baseRadius = size*0.8;
var base = new THREE.Mesh(
new THREE.CylinderGeometry(baseRadius,baseRadius,baseHeight,32,1),pieceMaterial[color]);
base.position.y = baseHeight/2;
var bodyRadius = size*0.6;
var body = new THREE.Mesh(
new THREE.SphereGeometry(bodyRadius,32,16),pieceMaterial[color]);
body.position.y = baseHeight + bodyRadius;
var neckHeight = size*2.3;
var neckBottomRadius = bodyRadius*0.15;
var neckTopRadius = bodyRadius*0.2;
var neck = new THREE.Mesh(
new THREE.CylinderGeometry(neckTopRadius,neckBottomRadius,neckHeight,32,1),pieceMaterial[color]);
neck.position.y = baseHeight + bodyRadius*2+neckHeight/2;
var collarHeight = size* 0.4;
var collarBottomRadius = size* 0.25;
var collarTopRadius = size* 0.45;
var collar = new THREE.Mesh(
new THREE.CylinderGeometry(collarTopRadius,collarBottomRadius,collarHeight,32,1),pieceMaterial[color]);
collar.position.y = baseHeight+bodyRadius*2+neckHeight - size*0.1;
var cross = new THREE.Object3D();
var crossThickness = size*0.2;
var crossHeight = size*0.8;
var crossGeo = new THREE.CubeGeometry(crossThickness,crossHeight,crossThickness);
var hCross = new THREE.Mesh(crossGeo,pieceMaterial[color]);
hCross.position.y = crossHeight/2;
var vCross = new THREE.Mesh(crossGeo,pieceMaterial[color]);
vCross.rotation.z = Math.PI/2;
vCross.position.y = crossHeight/2;
cross.add(hCross);
cross.add(vCross);
cross.position.y = baseHeight+bodyRadius*2 + neckHeight- size*0.1+collarHeight/2;
king.add(cross);
king.add(collar);
king.add(neck);
king.add(body);
king.add(base);
king.name = "King";
return king;
}