mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-26 20:51:38 +00:00
marble select
This commit is contained in:
parent
eb8978b406
commit
ef9a7cbe5e
8 changed files with 372 additions and 62 deletions
120
src/DtsObject.hx
120
src/DtsObject.hx
|
|
@ -1,5 +1,6 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import dts.TSDrawPrimitive;
|
||||||
import hxd.res.Sound;
|
import hxd.res.Sound;
|
||||||
import h3d.col.Bounds;
|
import h3d.col.Bounds;
|
||||||
import src.TimeState;
|
import src.TimeState;
|
||||||
|
|
@ -563,38 +564,87 @@ class DtsObject extends GameObject {
|
||||||
indices: []
|
indices: []
|
||||||
});
|
});
|
||||||
|
|
||||||
for (primitive in dtsMesh.primitives) {
|
var ab = new Vector();
|
||||||
var k = 0;
|
var ac = new Vector();
|
||||||
var geometrydata = materialGeometry[primitive.matIndex];
|
function addTriangleFromIndices(i1:Int, i2:Int, i3:Int, materialIndex:Int) {
|
||||||
|
ab.set(vertices[i2].x - vertices[i1].x, vertices[i2].y - vertices[i1].y, vertices[i2].z - vertices[i1].z);
|
||||||
for (i in primitive.firstElement...(primitive.firstElement + primitive.numElements - 2)) {
|
ac.set(vertices[i3].x - vertices[i1].x, vertices[i3].y - vertices[i1].y, vertices[i3].z - vertices[i1].z);
|
||||||
var i1 = dtsMesh.indices[i];
|
var normal = ab.cross(ac);
|
||||||
var i2 = dtsMesh.indices[i + 1];
|
normal.normalize();
|
||||||
var i3 = dtsMesh.indices[i + 2];
|
var dot1 = normal.dot(vertexNormals[i1]);
|
||||||
|
var dot2 = normal.dot(vertexNormals[i2]);
|
||||||
if (k % 2 == 0) {
|
var dot3 = normal.dot(vertexNormals[i3]);
|
||||||
// Swap the first and last index to mainting correct winding order
|
if (!StringTools.contains(this.dtsPath, 'helicopter.dts') && !StringTools.contains(this.dtsPath, 'tornado.dts'))
|
||||||
|
if (dot1 < 0 && dot2 < 0 && dot3 < 0) {
|
||||||
var temp = i1;
|
var temp = i1;
|
||||||
i1 = i3;
|
i1 = i3;
|
||||||
i3 = temp;
|
i3 = temp;
|
||||||
}
|
}
|
||||||
|
// ^ temp hardcoded fix
|
||||||
|
|
||||||
for (index in [i3, i2, i1]) {
|
var geometrydata = materialGeometry[materialIndex];
|
||||||
var vertex = vertices[index];
|
|
||||||
geometrydata.vertices.push(new Vector(vertex.x, vertex.y, vertex.z));
|
|
||||||
|
|
||||||
var uv = dtsMesh.uv[index];
|
for (index in [i3, i2, i1]) {
|
||||||
geometrydata.uvs.push(new UV(uv.x, uv.y));
|
var vertex = vertices[index];
|
||||||
|
geometrydata.vertices.push(new Vector(vertex.x, vertex.y, vertex.z));
|
||||||
|
|
||||||
var normal = vertexNormals[index];
|
var uv = dtsMesh.uv[index];
|
||||||
geometrydata.normals.push(new Vector(normal.x, normal.y, normal.z));
|
geometrydata.uvs.push(new UV(uv.x, uv.y));
|
||||||
|
|
||||||
|
var normal = vertexNormals[index];
|
||||||
|
geometrydata.normals.push(new Vector(normal.x, normal.y, normal.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
geometrydata.indices.push(i1);
|
||||||
|
geometrydata.indices.push(i2);
|
||||||
|
geometrydata.indices.push(i3);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (primitive in dtsMesh.primitives) {
|
||||||
|
var materialIndex = primitive.matIndex & TSDrawPrimitive.MaterialMask;
|
||||||
|
var drawType = primitive.matIndex & TSDrawPrimitive.TypeMask;
|
||||||
|
var geometrydata = materialGeometry[materialIndex];
|
||||||
|
|
||||||
|
if (drawType == TSDrawPrimitive.Triangles) {
|
||||||
|
var i = primitive.firstElement;
|
||||||
|
while (i < primitive.firstElement + primitive.numElements) {
|
||||||
|
var i1 = dtsMesh.indices[i];
|
||||||
|
var i2 = dtsMesh.indices[i + 1];
|
||||||
|
var i3 = dtsMesh.indices[i + 2];
|
||||||
|
|
||||||
|
addTriangleFromIndices(i1, i2, i3, materialIndex);
|
||||||
|
|
||||||
|
i += 3;
|
||||||
}
|
}
|
||||||
|
} else if (drawType == TSDrawPrimitive.Strip) {
|
||||||
|
var k = 0;
|
||||||
|
for (i in primitive.firstElement...(primitive.firstElement + primitive.numElements - 2)) {
|
||||||
|
var i1 = dtsMesh.indices[i];
|
||||||
|
var i2 = dtsMesh.indices[i + 1];
|
||||||
|
var i3 = dtsMesh.indices[i + 2];
|
||||||
|
|
||||||
geometrydata.indices.push(i1);
|
if (k % 2 == 0) {
|
||||||
geometrydata.indices.push(i2);
|
// Swap the first and last index to mainting correct winding order
|
||||||
geometrydata.indices.push(i3);
|
var temp = i1;
|
||||||
|
i1 = i3;
|
||||||
|
i3 = temp;
|
||||||
|
}
|
||||||
|
|
||||||
k++;
|
addTriangleFromIndices(i1, i2, i3, materialIndex);
|
||||||
|
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
} else if (drawType == TSDrawPrimitive.Fan) {
|
||||||
|
var i = primitive.firstElement;
|
||||||
|
while (i < primitive.firstElement + primitive.numElements - 2) {
|
||||||
|
var i1 = dtsMesh.indices[primitive.firstElement];
|
||||||
|
var i2 = dtsMesh.indices[i + 1];
|
||||||
|
var i3 = dtsMesh.indices[i + 2];
|
||||||
|
|
||||||
|
addTriangleFromIndices(i1, i2, i3, materialIndex);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -918,18 +968,20 @@ class DtsObject extends GameObject {
|
||||||
if (!this.useInstancing) {
|
if (!this.useInstancing) {
|
||||||
for (material in this.materials) {
|
for (material in this.materials) {
|
||||||
if (this.currentOpacity != 1) {
|
if (this.currentOpacity != 1) {
|
||||||
// material.blendMode = BlendMode.Alpha;
|
material.blendMode = BlendMode.Alpha;
|
||||||
// if (this.alphaShader == null) {
|
if (this.alphaShader == null) {
|
||||||
// this.alphaShader = new AlphaMult();
|
this.alphaShader = new AlphaMult();
|
||||||
// }
|
}
|
||||||
// if (material.mainPass.getShader(AlphaMult) == null) {
|
if (material.mainPass.getShader(AlphaMult) == null) {
|
||||||
// material.mainPass.addShader(this.alphaShader);
|
material.mainPass.addShader(this.alphaShader);
|
||||||
// }
|
}
|
||||||
// this.alphaShader.alpha = this.currentOpacity;
|
this.alphaShader.alpha = this.currentOpacity;
|
||||||
// } else {
|
} else {
|
||||||
// if (alphaShader != null) {
|
if (alphaShader != null) {
|
||||||
// alphaShader.alpha = this.currentOpacity;
|
material.blendMode = BlendMode.None;
|
||||||
// }
|
alphaShader.alpha = this.currentOpacity;
|
||||||
|
material.mainPass.removeShader(alphaShader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import h3d.mat.MaterialDatabase;
|
||||||
import shaders.MarbleReflection;
|
import shaders.MarbleReflection;
|
||||||
import shaders.CubemapRenderer;
|
import shaders.CubemapRenderer;
|
||||||
import h3d.shader.AlphaMult;
|
import h3d.shader.AlphaMult;
|
||||||
|
|
@ -206,8 +207,6 @@ class Marble extends GameObject {
|
||||||
this.omega = new Vector();
|
this.omega = new Vector();
|
||||||
this.camera = new CameraController(cast this);
|
this.camera = new CameraController(cast this);
|
||||||
|
|
||||||
this.collider = new SphereCollisionEntity(cast this);
|
|
||||||
|
|
||||||
this.bounceEmitterData = new ParticleData();
|
this.bounceEmitterData = new ParticleData();
|
||||||
this.bounceEmitterData.identifier = "MarbleBounceParticle";
|
this.bounceEmitterData.identifier = "MarbleBounceParticle";
|
||||||
this.bounceEmitterData.texture = ResourceLoader.getResource("data/particles/star.png", ResourceLoader.getTexture, this.textureResources);
|
this.bounceEmitterData.texture = ResourceLoader.getResource("data/particles/star.png", ResourceLoader.getTexture, this.textureResources);
|
||||||
|
|
@ -236,23 +235,50 @@ class Marble extends GameObject {
|
||||||
public function init(level:MarbleWorld, onFinish:Void->Void) {
|
public function init(level:MarbleWorld, onFinish:Void->Void) {
|
||||||
this.level = level;
|
this.level = level;
|
||||||
|
|
||||||
var geom = Sphere.defaultUnitSphere();
|
var marbleDts = new DtsObject();
|
||||||
geom.addUVs();
|
marbleDts.dtsPath = Settings.optionsSettings.marbleModel;
|
||||||
var marbleTexture = ResourceLoader.getFileEntry("data/shapes/balls/base.marble.png").toTexture();
|
marbleDts.matNameOverride.set("base.marble", Settings.optionsSettings.marbleSkin + ".marble");
|
||||||
var marbleMaterial = Material.create(marbleTexture);
|
marbleDts.showSequences = false;
|
||||||
marbleMaterial.shadows = false;
|
marbleDts.useInstancing = false;
|
||||||
marbleMaterial.castShadows = true;
|
marbleDts.init(null, () -> {}); // SYNC
|
||||||
|
for (mat in marbleDts.materials) {
|
||||||
|
mat.castShadows = true;
|
||||||
|
mat.shadows = true;
|
||||||
|
mat.receiveShadows = false;
|
||||||
|
// mat.mainPass.culling = None;
|
||||||
|
|
||||||
|
if (Settings.optionsSettings.reflectiveMarble) {
|
||||||
|
this.cubemapRenderer = new CubemapRenderer(level.scene);
|
||||||
|
mat.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate radius according to marble model (egh)
|
||||||
|
var b = marbleDts.getBounds();
|
||||||
|
var avgRadius = (b.xSize + b.ySize + b.zSize) / 6;
|
||||||
|
this._radius = avgRadius;
|
||||||
|
|
||||||
|
this.collider = new SphereCollisionEntity(cast this);
|
||||||
|
|
||||||
|
this.addChild(marbleDts);
|
||||||
|
|
||||||
|
// var geom = Sphere.defaultUnitSphere();
|
||||||
|
// geom.addUVs();
|
||||||
|
// var marbleTexture = ResourceLoader.getFileEntry("data/shapes/balls/base.marble.png").toTexture();
|
||||||
|
// var marbleMaterial = Material.create(marbleTexture);
|
||||||
|
// marbleMaterial.shadows = false;
|
||||||
|
// marbleMaterial.castShadows = true;
|
||||||
// marbleMaterial.mainPass.removeShader(marbleMaterial.textureShader);
|
// marbleMaterial.mainPass.removeShader(marbleMaterial.textureShader);
|
||||||
// var dtsShader = new DtsTexture();
|
// var dtsShader = new DtsTexture();
|
||||||
// dtsShader.texture = marbleTexture;
|
// dtsShader.texture = marbleTexture;
|
||||||
// dtsShader.currentOpacity = 1;
|
// dtsShader.currentOpacity = 1;
|
||||||
// marbleMaterial.mainPass.addShader(dtsShader);
|
// marbleMaterial.mainPass.addShader(dtsShader);
|
||||||
var obj = new Mesh(geom, marbleMaterial, this);
|
// var obj = new Mesh(geom, marbleMaterial, this);
|
||||||
obj.scale(_radius);
|
// obj.scale(_radius * 0.1);
|
||||||
if (Settings.optionsSettings.reflectiveMarble) {
|
// if (Settings.optionsSettings.reflectiveMarble) {
|
||||||
this.cubemapRenderer = new CubemapRenderer(level.scene);
|
// this.cubemapRenderer = new CubemapRenderer(level.scene);
|
||||||
marbleMaterial.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap));
|
// marbleMaterial.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap));
|
||||||
}
|
// }
|
||||||
|
|
||||||
this.forcefield = new DtsObject();
|
this.forcefield = new DtsObject();
|
||||||
this.forcefield.dtsPath = "data/shapes/images/glow_bounce.dts";
|
this.forcefield.dtsPath = "data/shapes/images/glow_bounce.dts";
|
||||||
|
|
@ -1486,20 +1512,13 @@ class Marble extends GameObject {
|
||||||
teleportFadeCompletion = Util.clamp(1 - (time.currentAttemptTime - this.teleportDisableTime) / 0.5, 0, 1);
|
teleportFadeCompletion = Util.clamp(1 - (time.currentAttemptTime - this.teleportDisableTime) / 0.5, 0, 1);
|
||||||
|
|
||||||
if (teleportFadeCompletion > 0) {
|
if (teleportFadeCompletion > 0) {
|
||||||
var mesh:Mesh = cast this.children[0];
|
var ourDts:DtsObject = cast this.children[0];
|
||||||
var shad:AlphaMult = mesh.material.mainPass.getShader(AlphaMult);
|
ourDts.setOpacity(Util.lerp(1, 0.25, teleportFadeCompletion));
|
||||||
if (shad == null) {
|
this.teleporting = true;
|
||||||
shad = new AlphaMult();
|
|
||||||
mesh.material.mainPass.addShader(shad);
|
|
||||||
mesh.material.blendMode = Alpha;
|
|
||||||
this.teleporting = true;
|
|
||||||
}
|
|
||||||
shad.alpha = Util.lerp(1, 0.25, teleportFadeCompletion);
|
|
||||||
} else {
|
} else {
|
||||||
if (this.teleporting) {
|
if (this.teleporting) {
|
||||||
var mesh:Mesh = cast this.children[0];
|
var ourDts:DtsObject = cast this.children[0];
|
||||||
mesh.material.mainPass.removeShader(mesh.material.mainPass.getShader(AlphaMult));
|
ourDts.setOpacity(1);
|
||||||
mesh.material.blendMode = None;
|
|
||||||
this.teleporting = false;
|
this.teleporting = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ typedef OptionsSettings = {
|
||||||
var frameRateVis:Bool;
|
var frameRateVis:Bool;
|
||||||
var oobInsults:Bool;
|
var oobInsults:Bool;
|
||||||
var reflectiveMarble:Bool;
|
var reflectiveMarble:Bool;
|
||||||
|
var marbleIndex:Int;
|
||||||
|
var marbleSkin:String;
|
||||||
|
var marbleModel:String;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef ControlsSettings = {
|
typedef ControlsSettings = {
|
||||||
|
|
@ -88,6 +91,9 @@ class Settings {
|
||||||
frameRateVis: true,
|
frameRateVis: true,
|
||||||
oobInsults: true,
|
oobInsults: true,
|
||||||
reflectiveMarble: true,
|
reflectiveMarble: true,
|
||||||
|
marbleIndex: 0,
|
||||||
|
marbleSkin: "base",
|
||||||
|
marbleModel: "data/shapes/balls/ball-superball.dts",
|
||||||
vsync: #if js true #end
|
vsync: #if js true #end
|
||||||
#if hl
|
#if hl
|
||||||
false
|
false
|
||||||
|
|
@ -175,7 +181,10 @@ class Settings {
|
||||||
controls: controlsSettings,
|
controls: controlsSettings,
|
||||||
touch: touchSettings,
|
touch: touchSettings,
|
||||||
stats: playStatistics,
|
stats: playStatistics,
|
||||||
highscoreName: highscoreName
|
highscoreName: highscoreName,
|
||||||
|
marbleIndex: optionsSettings.marbleIndex,
|
||||||
|
marbleSkin: optionsSettings.marbleSkin,
|
||||||
|
marbleModel: optionsSettings.marbleModel,
|
||||||
};
|
};
|
||||||
var scoreCount = 0;
|
var scoreCount = 0;
|
||||||
var eggCount = 0;
|
var eggCount = 0;
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ class Primitive {
|
||||||
var p = new Primitive();
|
var p = new Primitive();
|
||||||
p.firstElement = reader.readU16();
|
p.firstElement = reader.readU16();
|
||||||
p.numElements = reader.readU16();
|
p.numElements = reader.readU16();
|
||||||
p.matIndex = (reader.readU32() & 0x00ffffff);
|
p.matIndex = reader.readU32();
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
src/dts/TSDrawPrimitive.hx
Normal file
12
src/dts/TSDrawPrimitive.hx
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
@:publicFields
|
||||||
|
class TSDrawPrimitive {
|
||||||
|
static var Triangles = 0 << 30;
|
||||||
|
static var Strip = 1 << 30;
|
||||||
|
static var Fan = 2 << 30;
|
||||||
|
static var Indexed = 1 << 29;
|
||||||
|
static var NoMaterial = 1 << 28;
|
||||||
|
static var MaterialMask = ~(1 << 30 | 2 << 30 | 0 << 30 | 1 << 29 | 1 << 28);
|
||||||
|
static var TypeMask = (1 << 30 | 2 << 30 | 0 << 30);
|
||||||
|
}
|
||||||
|
|
@ -71,6 +71,19 @@ class GuiObjectShow extends GuiControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function changeObject(dts:DtsObject) {
|
||||||
|
if (_initialized) {
|
||||||
|
sceneObject.remove();
|
||||||
|
sceneObject.dispose();
|
||||||
|
sceneObject = dts;
|
||||||
|
|
||||||
|
scene.addChild(sceneObject);
|
||||||
|
var objCenter = sceneObject.getBounds().getCenter();
|
||||||
|
scene.camera.pos = new Vector(0, renderDistance * Math.cos(renderPitch), objCenter.z + renderDistance * Math.sin(renderPitch));
|
||||||
|
scene.camera.target = new Vector(objCenter.x, objCenter.y, objCenter.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override function renderEngine(engine:h3d.Engine) {
|
public override function renderEngine(engine:h3d.Engine) {
|
||||||
if (_initialized) {
|
if (_initialized) {
|
||||||
engine.pushTarget(this.sceneTarget);
|
engine.pushTarget(this.sceneTarget);
|
||||||
|
|
|
||||||
202
src/gui/MarbleSelectGui.hx
Normal file
202
src/gui/MarbleSelectGui.hx
Normal file
|
|
@ -0,0 +1,202 @@
|
||||||
|
package gui;
|
||||||
|
|
||||||
|
import h2d.filter.DropShadow;
|
||||||
|
import hxd.res.BitmapFont;
|
||||||
|
import h3d.prim.Polygon;
|
||||||
|
import h3d.scene.Mesh;
|
||||||
|
import h3d.shader.AlphaChannel;
|
||||||
|
import src.MarbleGame;
|
||||||
|
import h3d.Vector;
|
||||||
|
import src.ResourceLoader;
|
||||||
|
import src.DtsObject;
|
||||||
|
import src.Settings;
|
||||||
|
|
||||||
|
class MarbleSelectGui extends GuiImage {
|
||||||
|
public function new() {
|
||||||
|
var img = ResourceLoader.getImage("data/ui/marbleSelect/marbleSelect.png");
|
||||||
|
super(img.resource.toTile());
|
||||||
|
this.horizSizing = Center;
|
||||||
|
this.vertSizing = Center;
|
||||||
|
this.position = new Vector(73, -59);
|
||||||
|
this.extent = new Vector(493, 361);
|
||||||
|
|
||||||
|
var marbleData = [
|
||||||
|
{name: "Staff's Original", dts: "data/shapes/balls/ball-superball.dts", skin: "base"},
|
||||||
|
{name: "3D Marble", dts: "data/shapes/balls/3dMarble.dts", skin: "base"},
|
||||||
|
{name: "Mid P", dts: "data/shapes/balls/midp.dts", skin: "base"},
|
||||||
|
{name: "Spade", dts: "data/shapes/balls/ball-superball.dts", skin: "skin4"},
|
||||||
|
{name: "GMD Logo", dts: "data/shapes/balls/ball-superball.dts", skin: "skin5"},
|
||||||
|
{name: "Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin6"},
|
||||||
|
{name: "Golden Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin7"},
|
||||||
|
{name: "Rainbow Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin8"},
|
||||||
|
{name: "Brown Swirls", dts: "data/shapes/balls/ball-superball.dts", skin: "skin9"},
|
||||||
|
{name: "Caution Stripes", dts: "data/shapes/balls/ball-superball.dts", skin: "skin10"},
|
||||||
|
{name: "Earth", dts: "data/shapes/balls/ball-superball.dts", skin: "skin11"},
|
||||||
|
{name: "Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin12"},
|
||||||
|
{name: "Jupiter", dts: "data/shapes/balls/ball-superball.dts", skin: "skin13"},
|
||||||
|
{name: "MB Gold Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin14"},
|
||||||
|
{name: "MBP on the Marble!", dts: "data/shapes/balls/ball-superball.dts", skin: "skin15"},
|
||||||
|
{name: "Moshe", dts: "data/shapes/balls/ball-superball.dts", skin: "skin16"},
|
||||||
|
{name: "Strong Bad", dts: "data/shapes/balls/ball-superball.dts", skin: "skin17"},
|
||||||
|
{name: "Venus", dts: "data/shapes/balls/ball-superball.dts", skin: "skin18"},
|
||||||
|
{name: "Water", dts: "data/shapes/balls/ball-superball.dts", skin: "skin19"},
|
||||||
|
{name: "Evil Eye", dts: "data/shapes/balls/ball-superball.dts", skin: "skin20"},
|
||||||
|
{name: "Desert and Sky", dts: "data/shapes/balls/ball-superball.dts", skin: "skin21"},
|
||||||
|
{name: "Dirt Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin22"},
|
||||||
|
{name: "Friction Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin23"},
|
||||||
|
{name: "Grass", dts: "data/shapes/balls/ball-superball.dts", skin: "skin24"},
|
||||||
|
{name: "Mars", dts: "data/shapes/balls/ball-superball.dts", skin: "skin25"},
|
||||||
|
{name: "Phil's Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin26"},
|
||||||
|
{name: "Molten", dts: "data/shapes/balls/ball-superball.dts", skin: "skin27"},
|
||||||
|
{name: "Lightning", dts: "data/shapes/balls/ball-superball.dts", skin: "skin28"},
|
||||||
|
{name: "Phil'sEmpire", dts: "data/shapes/balls/ball-superball.dts", skin: "skin29"},
|
||||||
|
{name: "Matan's Red Dragon", dts: "data/shapes/balls/ball-superball.dts", skin: "skin30"},
|
||||||
|
{name: "Metallic Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin31"},
|
||||||
|
{name: "Sun", dts: "data/shapes/balls/ball-superball.dts", skin: "skin32"},
|
||||||
|
{name: "Underwater", dts: "data/shapes/balls/ball-superball.dts", skin: "skin33"},
|
||||||
|
{name: "GarageGames logo", dts: "data/shapes/balls/garageGames.dts", skin: "base"},
|
||||||
|
{name: "Big Marble 1", dts: "data/shapes/balls/bm1.dts", skin: "base"},
|
||||||
|
{name: "Big Marble 2", dts: "data/shapes/balls/bm2.dts", skin: "base"},
|
||||||
|
{name: "Big Marble 3", dts: "data/shapes/balls/bm3.dts", skin: "base"},
|
||||||
|
{name: "Small Marble 1", dts: "data/shapes/balls/sm1.dts", skin: "base"},
|
||||||
|
{name: "Small Marble 2", dts: "data/shapes/balls/sm2.dts", skin: "base"},
|
||||||
|
{name: "Small Marble 3", dts: "data/shapes/balls/sm3.dts", skin: "base"},
|
||||||
|
];
|
||||||
|
|
||||||
|
var curSelection:Int = Settings.optionsSettings.marbleIndex;
|
||||||
|
|
||||||
|
function loadButtonImages(path:String) {
|
||||||
|
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||||
|
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||||
|
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||||
|
var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||||
|
return [normal, hover, pressed, disabled];
|
||||||
|
}
|
||||||
|
|
||||||
|
var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt");
|
||||||
|
var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry);
|
||||||
|
@:privateAccess markerFelt32b.loader = ResourceLoader.loader;
|
||||||
|
var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||||
|
var markerFelt24 = markerFelt32b.toSdfFont(cast 18 * Settings.uiScale, MultiChannel);
|
||||||
|
var markerFelt28 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||||
|
|
||||||
|
var selectBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/select"));
|
||||||
|
selectBtn.horizSizing = Center;
|
||||||
|
selectBtn.vertSizing = Top;
|
||||||
|
selectBtn.position = new Vector(199, 270);
|
||||||
|
selectBtn.extent = new Vector(95, 45);
|
||||||
|
selectBtn.pressedAction = (e) -> {
|
||||||
|
Settings.optionsSettings.marbleIndex = curSelection;
|
||||||
|
Settings.optionsSettings.marbleSkin = marbleData[curSelection].skin;
|
||||||
|
Settings.optionsSettings.marbleModel = marbleData[curSelection].dts;
|
||||||
|
Settings.save();
|
||||||
|
MarbleGame.canvas.popDialog(this);
|
||||||
|
}
|
||||||
|
this.addChild(selectBtn);
|
||||||
|
|
||||||
|
var marbleShow = buildObjectShow(marbleData[curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, 0);
|
||||||
|
marbleShow.horizSizing = Center;
|
||||||
|
marbleShow.vertSizing = Bottom;
|
||||||
|
marbleShow.visible = true;
|
||||||
|
this.addChild(marbleShow);
|
||||||
|
|
||||||
|
var titleText = new GuiMLText(markerFelt28, null);
|
||||||
|
titleText.text.textColor = 0xFFFFFF;
|
||||||
|
titleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true);
|
||||||
|
titleText.horizSizing = Center;
|
||||||
|
titleText.vertSizing = Bottom;
|
||||||
|
titleText.position = new Vector(140, 67);
|
||||||
|
titleText.extent = new Vector(213, 27);
|
||||||
|
titleText.text.text = '<p align="center">Official Marbles</p>';
|
||||||
|
this.addChild(titleText);
|
||||||
|
|
||||||
|
var marbleText = new GuiMLText(markerFelt24, null);
|
||||||
|
marbleText.text.textColor = 0xFFFFFF;
|
||||||
|
marbleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true);
|
||||||
|
marbleText.horizSizing = Center;
|
||||||
|
marbleText.vertSizing = Bottom;
|
||||||
|
marbleText.position = new Vector(86, 243);
|
||||||
|
marbleText.extent = new Vector(320, 22);
|
||||||
|
marbleText.text.text = '<p align="center">${marbleData[curSelection].name}</p>';
|
||||||
|
this.addChild(marbleText);
|
||||||
|
|
||||||
|
var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources)
|
||||||
|
.toTile());
|
||||||
|
changeMarbleText.horizSizing = Center;
|
||||||
|
changeMarbleText.position = new Vector(96, 26);
|
||||||
|
changeMarbleText.extent = new Vector(300, 39);
|
||||||
|
this.addChild(changeMarbleText);
|
||||||
|
|
||||||
|
function setMarbleSelection(idx:Int) {
|
||||||
|
if (idx < 0)
|
||||||
|
idx = marbleData.length + idx;
|
||||||
|
if (idx >= marbleData.length)
|
||||||
|
idx -= marbleData.length;
|
||||||
|
curSelection = idx;
|
||||||
|
var marble = marbleData[idx];
|
||||||
|
|
||||||
|
marbleText.text.text = '<p align="center">${marble.name}</p>';
|
||||||
|
|
||||||
|
var dtsObj = new DtsObject();
|
||||||
|
dtsObj.dtsPath = marble.dts;
|
||||||
|
dtsObj.ambientRotate = true;
|
||||||
|
dtsObj.ambientSpinFactor /= -2;
|
||||||
|
dtsObj.showSequences = false;
|
||||||
|
dtsObj.useInstancing = false;
|
||||||
|
dtsObj.matNameOverride.set("base.marble", marble.skin + ".marble");
|
||||||
|
dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway
|
||||||
|
for (mat in dtsObj.materials) {
|
||||||
|
mat.mainPass.enableLights = false;
|
||||||
|
mat.mainPass.culling = None;
|
||||||
|
if (mat.blendMode != Alpha && mat.blendMode != Add)
|
||||||
|
mat.mainPass.addShader(new AlphaChannel());
|
||||||
|
}
|
||||||
|
marbleShow.changeObject(dtsObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
var nextBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/next"));
|
||||||
|
nextBtn.position = new Vector(296, 270);
|
||||||
|
nextBtn.extent = new Vector(75, 45);
|
||||||
|
nextBtn.pressedAction = (e) -> {
|
||||||
|
setMarbleSelection(curSelection + 1);
|
||||||
|
}
|
||||||
|
this.addChild(nextBtn);
|
||||||
|
|
||||||
|
var prevBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/prev"));
|
||||||
|
prevBtn.position = new Vector(123, 270);
|
||||||
|
prevBtn.extent = new Vector(75, 45);
|
||||||
|
prevBtn.pressedAction = (e) -> {
|
||||||
|
setMarbleSelection(curSelection - 1);
|
||||||
|
}
|
||||||
|
setMarbleSelection(curSelection);
|
||||||
|
this.addChild(prevBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildObjectShow(dtsPath:String, position:Vector, extent:Vector, dist:Float = 5, pitch:Float = 0, matnameOverride:Map<String, String> = null) {
|
||||||
|
var oShow = new GuiObjectShow();
|
||||||
|
var dtsObj = new DtsObject();
|
||||||
|
dtsObj.dtsPath = dtsPath;
|
||||||
|
dtsObj.ambientRotate = true;
|
||||||
|
dtsObj.ambientSpinFactor /= -2;
|
||||||
|
dtsObj.showSequences = false;
|
||||||
|
dtsObj.useInstancing = false;
|
||||||
|
if (matnameOverride != null) {
|
||||||
|
for (key => value in matnameOverride) {
|
||||||
|
dtsObj.matNameOverride.set(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway
|
||||||
|
for (mat in dtsObj.materials) {
|
||||||
|
mat.mainPass.enableLights = false;
|
||||||
|
mat.mainPass.culling = None;
|
||||||
|
if (mat.blendMode != Alpha && mat.blendMode != Add)
|
||||||
|
mat.mainPass.addShader(new AlphaChannel());
|
||||||
|
}
|
||||||
|
oShow.sceneObject = dtsObj;
|
||||||
|
oShow.position = position;
|
||||||
|
oShow.extent = extent;
|
||||||
|
oShow.renderDistance = dist;
|
||||||
|
oShow.renderPitch = pitch;
|
||||||
|
return oShow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -613,6 +613,9 @@ class PlayMissionGui extends GuiImage {
|
||||||
var pmMarbleSelect = new GuiButton(loadButtonImages("data/ui/play/marble"));
|
var pmMarbleSelect = new GuiButton(loadButtonImages("data/ui/play/marble"));
|
||||||
pmMarbleSelect.position = new Vector(50, 46);
|
pmMarbleSelect.position = new Vector(50, 46);
|
||||||
pmMarbleSelect.extent = new Vector(43, 43);
|
pmMarbleSelect.extent = new Vector(43, 43);
|
||||||
|
pmMarbleSelect.pressedAction = (e) -> {
|
||||||
|
MarbleGame.canvas.pushDialog(new MarbleSelectGui());
|
||||||
|
}
|
||||||
pmMorePopDlg.addChild(pmMarbleSelect);
|
pmMorePopDlg.addChild(pmMarbleSelect);
|
||||||
|
|
||||||
var pmStats = new GuiButton(loadButtonImages("data/ui/play/statistics"));
|
var pmStats = new GuiButton(loadButtonImages("data/ui/play/statistics"));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue