|
|
@@ -109,6 +109,58 @@ |
|
|
|
var standard_d100_dice_face_labels = [' ', '00', '10', '20', '30', '40', '50',
|
|
|
|
'60', '70', '80', '90'];
|
|
|
|
|
|
|
|
function createDiceMaterials(type, labelColor, diceColor) {
|
|
|
|
if (type === 'd4') {
|
|
|
|
return create_d4_materials(scale / 2, scale * 2);
|
|
|
|
} else if (type === 'd100') {
|
|
|
|
_createDiceMaterials(standard_d100_dice_face_labels,
|
|
|
|
scale * 1.5,
|
|
|
|
labelColor,
|
|
|
|
diceColor);
|
|
|
|
} else {
|
|
|
|
_createDiceMaterials(standard_d20_dice_face_labels,
|
|
|
|
scale,
|
|
|
|
labelColor,
|
|
|
|
diceColor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function _createDiceMaterials(face_labels, margin, labelColor, diceColor) {
|
|
|
|
function create_text_texture(text, color, back_color) {
|
|
|
|
if (text === undefined) return null;
|
|
|
|
var canvas = document.createElement("canvas");
|
|
|
|
var context = canvas.getContext("2d");
|
|
|
|
var size = scale / 2;
|
|
|
|
canvas.width = size + margin;
|
|
|
|
canvas.height = size + margin;
|
|
|
|
context.font = size + "pt Arial";
|
|
|
|
context.fillStyle = back_color;
|
|
|
|
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
|
|
context.textAlign = "center";
|
|
|
|
context.textBaseline = "middle";
|
|
|
|
context.fillStyle = color;
|
|
|
|
context.fillText(text, canvas.width / 2, canvas.height / 2);
|
|
|
|
if (text == '6' || text == '9') {
|
|
|
|
context.fillText(' .', canvas.width / 2, canvas.height / 2);
|
|
|
|
}
|
|
|
|
var texture = new THREE.Texture(canvas);
|
|
|
|
texture.needsUpdate = true;
|
|
|
|
return texture;
|
|
|
|
}
|
|
|
|
var materials = [];
|
|
|
|
for (var i = 0; i < face_labels.length; ++i) {
|
|
|
|
materials.push(
|
|
|
|
new THREE.MeshPhongMaterial(
|
|
|
|
$t.copyto(material_options,
|
|
|
|
{map: create_text_texture(face_labels[i],
|
|
|
|
labelColor,
|
|
|
|
diceColor)})
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return materials;
|
|
|
|
}
|
|
|
|
|
|
|
|
function create_dice_materials(face_labels, size, margin, labelColor, diceColor) {
|
|
|
|
function create_text_texture(text, color, back_color) {
|
|
|
|
if (text === undefined) return null;
|
|
|
@@ -142,7 +194,7 @@ |
|
|
|
);
|
|
|
|
}
|
|
|
|
return materials;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function create_d4_materials(size, margin) {
|
|
|
|
function create_d4_text(text, color, back_color) {
|
|
|
@@ -273,27 +325,33 @@ |
|
|
|
d20: {mass: 340, inertia: 10, scaleMultiplier: 1},
|
|
|
|
d100: {mass: 340, inertia: 10, scaleMultiplier: 0.9},
|
|
|
|
};
|
|
|
|
var diceMaterialCache = {}, diceGeometryCache = {};
|
|
|
|
var dieMaterialCache = {}, dieGeometryCache = {};
|
|
|
|
|
|
|
|
this.create_d4 = function() {
|
|
|
|
if (!diceGeometryCache.d4) {
|
|
|
|
diceGeometryCache.d4 = createDieGeometry(
|
|
|
|
if (!dieGeometryCache.d4) {
|
|
|
|
dieGeometryCache.d4 = createDieGeometry(
|
|
|
|
'd4',
|
|
|
|
scale * diceInfo.d4.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (!diceMaterialCache.d4) {
|
|
|
|
diceMaterialCache.d4 = new THREE.MeshFaceMaterial(
|
|
|
|
create_d4_materials(scale / 2, scale * 2)
|
|
|
|
if (!dieMaterialCache.d4) {
|
|
|
|
dieMaterialCache.d4 = new THREE.MeshFaceMaterial(
|
|
|
|
createDiceMaterials('d4', diceColor, labelColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(diceGeometryCache.d4, diceMaterialCache.d4);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d4, dieMaterialCache.d4);
|
|
|
|
};
|
|
|
|
|
|
|
|
this.create_d6 = function() {
|
|
|
|
if (!this.d6_geometry) this.d6_geometry = create_d6_geometry(scale * 0.9);
|
|
|
|
if (!diceMaterialCache[labelColor + diceColor]) {
|
|
|
|
diceMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
if (!dieGeometryCache.d6) {
|
|
|
|
dieGeometryCache.d6 = createDieGeometry(
|
|
|
|
'd6',
|
|
|
|
scale * diceInfo.d6.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!dieMaterialCache[labelColor + diceColor]) {
|
|
|
|
dieMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d20_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale,
|
|
|
@@ -301,74 +359,107 @@ |
|
|
|
labelColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d6_geometry, diceMaterialCache[labelColor + diceColor]);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d6, dieMaterialCache[labelColor + diceColor]);
|
|
|
|
};
|
|
|
|
|
|
|
|
this.create_d8 = function(/*labelColor, diceColor*/) {
|
|
|
|
if (!this.d8_geometry) {
|
|
|
|
this.d8_geometry = create_d8_geometry(scale);
|
|
|
|
if (!dieGeometryCache.d8) {
|
|
|
|
dieGeometryCache.d8 = createDieGeometry(
|
|
|
|
'd8',
|
|
|
|
scale * diceInfo.d8.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (!diceMaterialCache[labelColor + diceColor]) {
|
|
|
|
diceMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
|
|
|
|
if (!dieMaterialCache[labelColor + diceColor]) {
|
|
|
|
dieMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d20_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale,
|
|
|
|
labelColor,
|
|
|
|
diceColor));
|
|
|
|
diceColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d8_geometry, diceMaterialCache[labelColor + diceColor]);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d8, dieMaterialCache[labelColor + diceColor]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.create_d10 = function() {
|
|
|
|
if (!this.d10_geometry) this.d10_geometry = create_d10_geometry(scale * 0.9);
|
|
|
|
if (!diceMaterialCache[labelColor + diceColor]) {
|
|
|
|
diceMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
if (!dieGeometryCache.d10) {
|
|
|
|
dieGeometryCache.d10 = createDieGeometry(
|
|
|
|
'd10',
|
|
|
|
scale * diceInfo.d10.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!dieMaterialCache[labelColor + diceColor]) {
|
|
|
|
dieMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d20_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale,
|
|
|
|
labelColor,
|
|
|
|
diceColor));
|
|
|
|
diceColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d10_geometry, diceMaterialCache[labelColor + diceColor]);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d10, dieMaterialCache[labelColor + diceColor]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.create_d12 = function() {
|
|
|
|
if (!this.d12_geometry) this.d12_geometry = create_d12_geometry(scale * 0.9);
|
|
|
|
if (!diceMaterialCache[labelColor + diceColor]) {
|
|
|
|
diceMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
if (!dieGeometryCache.d12) {
|
|
|
|
dieGeometryCache.d12 = createDieGeometry(
|
|
|
|
'd12',
|
|
|
|
scale * diceInfo.d12.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!dieMaterialCache[labelColor + diceColor]) {
|
|
|
|
dieMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d20_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale,
|
|
|
|
labelColor,
|
|
|
|
diceColor));
|
|
|
|
diceColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d12_geometry, diceMaterialCache[labelColor + diceColor]);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d12, dieMaterialCache[labelColor + diceColor]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.create_d20 = function() {
|
|
|
|
if (!this.d20_geometry) this.d20_geometry = create_d20_geometry(scale);
|
|
|
|
if (!diceMaterialCache[labelColor + diceColor]) {
|
|
|
|
diceMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
if (!dieGeometryCache.d20) {
|
|
|
|
dieGeometryCache.d20 = createDieGeometry(
|
|
|
|
'd20',
|
|
|
|
scale * diceInfo.d20.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!dieMaterialCache[labelColor + diceColor]) {
|
|
|
|
dieMaterialCache[labelColor + diceColor] = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d20_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale,
|
|
|
|
labelColor,
|
|
|
|
diceColor));
|
|
|
|
diceColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d20_geometry, diceMaterialCache[labelColor + diceColor]);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d20, dieMaterialCache[labelColor + diceColor]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.create_d100 = function() {
|
|
|
|
if (!this.d10_geometry) this.d10_geometry = this.create_d10_geometry(scale * 0.9);
|
|
|
|
if (!dieGeometryCache.d100) {
|
|
|
|
dieGeometryCache.d100 = createDieGeometry(
|
|
|
|
'd100',
|
|
|
|
scale * diceInfo.d100.scaleMultiplier
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!d100MaterialCache) {
|
|
|
|
d100MaterialCache = new THREE.MeshFaceMaterial(
|
|
|
|
create_dice_materials(standard_d100_dice_face_labels,
|
|
|
|
scale / 2,
|
|
|
|
scale * 1.5,
|
|
|
|
labelColor,
|
|
|
|
diceColor));
|
|
|
|
diceColor)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return new THREE.Mesh(this.d10_geometry, d100MaterialCache);
|
|
|
|
return new THREE.Mesh(dieGeometryCache.d100, d100MaterialCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.parse_notation = function(notation) {
|
|
|
@@ -759,3 +850,4 @@ |
|
|
|
|
|
|
|
}).apply(teal.dice = teal.dice || {});
|
|
|
|
|
|
|
|
|