redo dif building and handle custom stuff

This commit is contained in:
RandomityGuy 2023-05-26 14:34:15 +05:30
parent 8b28d74e04
commit e36f4e824a
5 changed files with 143 additions and 140 deletions

View file

@ -305,7 +305,6 @@ class DifBuilder {
difresource.acquire(); difresource.acquire();
var dif = difresource.resource; var dif = difresource.resource;
var geo = so == -1 ? dif.interiors[0] : dif.subObjects[so]; var geo = so == -1 ? dif.interiors[0] : dif.subObjects[so];
var hulls = geo.convexHulls;
var triangles = []; var triangles = [];
var textures = []; var textures = [];
var collider = new CollisionEntity(itr); var collider = new CollisionEntity(itr);
@ -323,145 +322,140 @@ class DifBuilder {
var vertexBuckets = new Map<Point3F, Array<VertexBucket>>(); var vertexBuckets = new Map<Point3F, Array<VertexBucket>>();
var edges = []; var edges = [];
var colliderSurfaces = []; var colliderSurfaces = [];
for (i in 0...hulls.length) { for (i in 0...geo.surfaces.length) {
var hullTris = []; var surfaceindex = i;
var hull = hulls[i]; var surface = geo.surfaces[surfaceindex];
for (j in hull.surfaceStart...(hull.surfaceStart + hull.surfaceCount)) { if (surface == null)
var surfaceindex = geo.hullSurfaceIndices[j]; continue;
var surface = geo.surfaces[surfaceindex]; var planeindex = surface.planeIndex;
if (surface == null) var planeFlipped = (planeindex & 0x8000) == 0x8000;
continue; if (planeFlipped)
var planeindex = surface.planeIndex; planeindex &= ~0x8000;
var planeFlipped = (planeindex & 0x8000) == 0x8000; var plane = geo.planes[planeindex];
if (planeFlipped) var normal = geo.normals[plane.normalIndex];
planeindex &= ~0x8000; if (planeFlipped)
var plane = geo.planes[planeindex]; normal = normal.scalar(-1);
var normal = geo.normals[plane.normalIndex]; var texture = geo.materialList[surface.textureIndex];
if (planeFlipped) if (!textures.contains(texture))
normal = normal.scalar(-1); textures.push(texture);
var texture = geo.materialList[surface.textureIndex]; var points = geo.points;
if (!textures.contains(texture)) var colliderSurface = new CollisionSurface();
textures.push(texture); colliderSurface.points = [];
var points = geo.points; colliderSurface.normals = [];
var colliderSurface = new CollisionSurface(); colliderSurface.indices = [];
colliderSurface.points = []; colliderSurface.transformKeys = [];
colliderSurface.normals = []; colliderSurface.edgeData = [];
colliderSurface.indices = []; colliderSurface.edgeConcavities = [];
colliderSurface.transformKeys = []; colliderSurface.originalIndices = [];
colliderSurface.edgeData = []; colliderSurface.originalSurfaceIndex = surfaceindex;
colliderSurface.edgeConcavities = []; for (k in (surface.windingStart + 2)...(surface.windingStart + surface.windingCount)) {
colliderSurface.originalIndices = []; var p1, p2, p3;
colliderSurface.originalSurfaceIndex = surfaceindex; if ((k - (surface.windingStart + 2)) % 2 == 0) {
for (k in (surface.windingStart + 2)...(surface.windingStart + surface.windingCount)) { p1 = points[geo.windings[k]];
var p1, p2, p3; p2 = points[geo.windings[k - 1]];
if ((k - (surface.windingStart + 2)) % 2 == 0) { p3 = points[geo.windings[k - 2]];
p1 = points[geo.windings[k]]; colliderSurface.originalIndices.push(geo.windings[k]);
p2 = points[geo.windings[k - 1]]; colliderSurface.originalIndices.push(geo.windings[k - 1]);
p3 = points[geo.windings[k - 2]]; colliderSurface.originalIndices.push(geo.windings[k - 2]);
colliderSurface.originalIndices.push(geo.windings[k]); } else {
colliderSurface.originalIndices.push(geo.windings[k - 1]); p1 = points[geo.windings[k - 2]];
colliderSurface.originalIndices.push(geo.windings[k - 2]); p2 = points[geo.windings[k - 1]];
} else { p3 = points[geo.windings[k]];
p1 = points[geo.windings[k - 2]]; colliderSurface.originalIndices.push(geo.windings[k - 2]);
p2 = points[geo.windings[k - 1]]; colliderSurface.originalIndices.push(geo.windings[k - 1]);
p3 = points[geo.windings[k]]; colliderSurface.originalIndices.push(geo.windings[k]);
colliderSurface.originalIndices.push(geo.windings[k - 2]); }
colliderSurface.originalIndices.push(geo.windings[k - 1]); var e1 = new TriangleEdge(geo.windings[k], geo.windings[k - 1], geo.windings[k - 2], surfaceindex);
colliderSurface.originalIndices.push(geo.windings[k]); var e2 = new TriangleEdge(geo.windings[k - 1], geo.windings[k - 2], geo.windings[k], surfaceindex);
} var e3 = new TriangleEdge(geo.windings[k], geo.windings[k - 2], geo.windings[k - 1], surfaceindex);
var e1 = new TriangleEdge(geo.windings[k], geo.windings[k - 1], geo.windings[k - 2], surfaceindex); edges.push(e1);
var e2 = new TriangleEdge(geo.windings[k - 1], geo.windings[k - 2], geo.windings[k], surfaceindex); edges.push(e2);
var e3 = new TriangleEdge(geo.windings[k], geo.windings[k - 2], geo.windings[k - 1], surfaceindex); edges.push(e3);
edges.push(e1); var texgen = geo.texGenEQs[surface.texGenIndex];
edges.push(e2); var uv1 = new Point2F(p1.x * texgen.planeX.x
edges.push(e3); + p1.y * texgen.planeX.y
var texgen = geo.texGenEQs[surface.texGenIndex]; + p1.z * texgen.planeX.z
var uv1 = new Point2F(p1.x * texgen.planeX.x + texgen.planeX.d,
+ p1.y * texgen.planeX.y p1.x * texgen.planeY.x
+ p1.z * texgen.planeX.z + p1.y * texgen.planeY.y
+ texgen.planeX.d, + p1.z * texgen.planeY.z
p1.x * texgen.planeY.x + texgen.planeY.d);
+ p1.y * texgen.planeY.y var uv2 = new Point2F(p2.x * texgen.planeX.x
+ p1.z * texgen.planeY.z + p2.y * texgen.planeX.y
+ texgen.planeY.d); + p2.z * texgen.planeX.z
var uv2 = new Point2F(p2.x * texgen.planeX.x + texgen.planeX.d,
+ p2.y * texgen.planeX.y p2.x * texgen.planeY.x
+ p2.z * texgen.planeX.z + p2.y * texgen.planeY.y
+ texgen.planeX.d, + p2.z * texgen.planeY.z
p2.x * texgen.planeY.x + texgen.planeY.d);
+ p2.y * texgen.planeY.y var uv3 = new Point2F(p3.x * texgen.planeX.x
+ p2.z * texgen.planeY.z + p3.y * texgen.planeX.y
+ texgen.planeY.d); + p3.z * texgen.planeX.z
var uv3 = new Point2F(p3.x * texgen.planeX.x + texgen.planeX.d,
+ p3.y * texgen.planeX.y p3.x * texgen.planeY.x
+ p3.z * texgen.planeX.z + p3.y * texgen.planeY.y
+ texgen.planeX.d, + p3.z * texgen.planeY.z
p3.x * texgen.planeY.x + texgen.planeY.d);
+ p3.y * texgen.planeY.y var tri = new DifBuilderTriangle();
+ p3.z * texgen.planeY.z tri.texture = texture;
+ texgen.planeY.d); tri.normal1 = normal;
var tri = new DifBuilderTriangle(); tri.normal2 = normal;
tri.texture = texture; tri.normal3 = normal;
tri.normal1 = normal; tri.p1 = p1;
tri.normal2 = normal; tri.p2 = p2;
tri.normal3 = normal; tri.p3 = p3;
tri.p1 = p1; tri.uv1 = uv1;
tri.p2 = p2; tri.uv2 = uv2;
tri.p3 = p3; tri.uv3 = uv3;
tri.uv1 = uv1; triangles.push(tri);
tri.uv2 = uv2; var materialName = stripTexName(texture).toLowerCase();
tri.uv3 = uv3; var hasMaterialInfo = materialDict.exists(materialName);
triangles.push(tri); if (hasMaterialInfo) {
hullTris.push(tri); var minfo = materialDict.get(materialName);
var materialName = stripTexName(texture).toLowerCase(); colliderSurface.friction = minfo.friction;
var hasMaterialInfo = materialDict.exists(materialName); colliderSurface.restitution = minfo.restitution;
if (hasMaterialInfo) { colliderSurface.force = minfo.force != null ? minfo.force : 0;
var minfo = materialDict.get(materialName); }
colliderSurface.friction = minfo.friction; colliderSurface.points.push(new Vector(-p1.x, p1.y, p1.z));
colliderSurface.restitution = minfo.restitution; colliderSurface.points.push(new Vector(-p2.x, p2.y, p2.z));
colliderSurface.force = minfo.force != null ? minfo.force : 0; colliderSurface.points.push(new Vector(-p3.x, p3.y, p3.z));
} colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z));
colliderSurface.points.push(new Vector(-p1.x, p1.y, p1.z)); colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z));
colliderSurface.points.push(new Vector(-p2.x, p2.y, p2.z)); colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z));
colliderSurface.points.push(new Vector(-p3.x, p3.y, p3.z)); colliderSurface.indices.push(colliderSurface.indices.length);
colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z)); colliderSurface.indices.push(colliderSurface.indices.length);
colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z)); colliderSurface.indices.push(colliderSurface.indices.length);
colliderSurface.normals.push(new Vector(-normal.x, normal.y, normal.z)); colliderSurface.transformKeys.push(0);
colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.transformKeys.push(0);
colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.transformKeys.push(0);
colliderSurface.indices.push(colliderSurface.indices.length); for (v in [p1, p2, p3]) {
colliderSurface.transformKeys.push(0); var buckets = vertexBuckets.get(v);
colliderSurface.transformKeys.push(0); if (buckets == null) {
colliderSurface.transformKeys.push(0); buckets = [];
for (v in [p1, p2, p3]) { vertexBuckets.set(v, buckets);
var buckets = vertexBuckets.get(v); }
if (buckets == null) { var bucket:VertexBucket = null;
buckets = []; for (j in 0...buckets.length) {
vertexBuckets.set(v, buckets); bucket = buckets[j];
} if (normal.dot(bucket.referenceNormal) > Math.cos(Math.PI / 12))
var bucket:VertexBucket = null; break;
for (j in 0...buckets.length) { bucket = null;
bucket = buckets[j]; }
if (normal.dot(bucket.referenceNormal) > Math.cos(Math.PI / 12)) if (bucket == null) {
break; bucket = {
bucket = null; referenceNormal: normal,
} triangleIndices: [],
if (bucket == null) { normals: []
bucket = { };
referenceNormal: normal, buckets.push(bucket);
triangleIndices: [], }
normals: [] bucket.triangleIndices.push(triangles.length - 1);
}; bucket.normals.push(normal);
buckets.push(bucket);
}
bucket.triangleIndices.push(triangles.length - 1);
bucket.normals.push(normal);
}
} }
colliderSurface.generateBoundingBox();
collider.addSurface(colliderSurface);
colliderSurfaces.push(colliderSurface);
} }
colliderSurface.generateBoundingBox();
collider.addSurface(colliderSurface);
colliderSurfaces.push(colliderSurface);
} }
var edgeMap:Map<Int, TriangleEdge> = new Map(); var edgeMap:Map<Int, TriangleEdge> = new Map();
var internalEdges:Map<Int, Bool> = new Map(); var internalEdges:Map<Int, Bool> = new Map();

View file

@ -259,7 +259,7 @@ class MarbleGame {
canvas.setContent(new MainMenuGui()); canvas.setContent(new MainMenuGui());
#end #end
} else { } else {
if (!world.mission.isClaMission) { if (!world.mission.isClaMission && !world.mission.isCustom) {
PlayMissionGui.currentCategoryStatic = world.mission.type; PlayMissionGui.currentCategoryStatic = world.mission.type;
} }
var pmg = new PlayMissionGui(); var pmg = new PlayMissionGui();

View file

@ -39,6 +39,7 @@ class Mission {
public var isClaMission:Bool; public var isClaMission:Bool;
public var game:String; public var game:String;
public var hasEgg:Bool; public var hasEgg:Bool;
public var isCustom:Bool;
var next:Mission; var next:Mission;

View file

@ -35,7 +35,14 @@ class MissionList {
var misParser = new MisParser(file.getText()); var misParser = new MisParser(file.getText());
var mInfo = misParser.parseMissionInfo(); var mInfo = misParser.parseMissionInfo();
var mission = Mission.fromMissionInfo(file.path, mInfo); var mission = Mission.fromMissionInfo(file.path, mInfo);
mission.game = game; if (game != "custom")
mission.game = game;
else if (mInfo.game != null && mInfo.game != "")
mission.game = mInfo.game.toLowerCase();
else
mission.game = game; // Last case scenario
if (game == "custom")
mission.isCustom = true;
// do egg thing // do egg thing
if (StringTools.contains(file.getText().toLowerCase(), 'datablock = "easteregg"')) { // Ew if (StringTools.contains(file.getText().toLowerCase(), 'datablock = "easteregg"')) { // Ew
mission.hasEgg = true; mission.hasEgg = true;

View file

@ -57,6 +57,7 @@ class MissionElementScriptObject extends MissionElementBase {
var ultimatetime:String; var ultimatetime:String;
var music:String; var music:String;
var alarmstarttime:String; var alarmstarttime:String;
var game:String;
public function new() { public function new() {
_type = MissionElementType.ScriptObject; _type = MissionElementType.ScriptObject;