From 53b7525920362fac4fe00403bbd3a2e22d221d46 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:13:46 +0530 Subject: [PATCH] fix sporkintheroad and add custom friction support --- src/DifBuilder.hx | 29 ++++++++++++++++++++------ src/mis/MisParser.hx | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index cfb4c27f..9a2eaaba 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -216,6 +216,12 @@ class DifBuilder { }, ]; + static var customMaterialDict:Map = []; + static function createDefaultMaterial(onFinish:hxsl.Shader->Void, baseTexture:String, normalTexture:String, shininess:Float, specularColor:Vector, uvScaleFactor:Float = 1, half:Bool = false) { var worker = new ResourceLoaderWorker(() -> { @@ -394,6 +400,10 @@ class DifBuilder { 'stripe_caution' => (onFinish) -> createDefaultNormalMaterial(onFinish, 'data/textures/stripe_caution.png', 12, new Vector(0.8, 0.8, 0.6, 1)), ]; + public static function setCustomMaterialDefinitions(materials:Map) { + customMaterialDict = materials; + } + public static function loadDif(path:String, itr:InteriorObject, onFinish:Void->Void, ?so:Int = -1, makeCollideable = true) { #if (js || android) path = StringTools.replace(path, "data/", ""); @@ -680,16 +690,23 @@ class DifBuilder { // } triangles.push(tri); var materialName = stripTexName(texture).toLowerCase(); - var hasMaterialInfo = materialDict.exists(materialName); - if (hasMaterialInfo) { - var minfo = materialDict.get(materialName); - if (makeCollideable) { + if (makeCollideable) { + var hasCustomMaterialInfo = customMaterialDict.exists(materialName); + if (hasCustomMaterialInfo) { + var minfo = customMaterialDict.get(materialName); colliderSurface.friction = minfo.friction; colliderSurface.restitution = minfo.restitution; colliderSurface.force = minfo.force != null ? minfo.force : 0; + } else { + var hasMaterialInfo = materialDict.exists(materialName); + if (hasMaterialInfo) { + var minfo = materialDict.get(materialName); + colliderSurface.friction = minfo.friction; + colliderSurface.restitution = minfo.restitution; + colliderSurface.force = minfo.force != null ? minfo.force : 0; + } } - } - if (makeCollideable) { + colliderSurface.addPoint(-p1.x, p1.y, p1.z); colliderSurface.addPoint(-p2.x, p2.y, p2.z); colliderSurface.addPoint(-p3.x, p3.y, p3.z); diff --git a/src/mis/MisParser.hx b/src/mis/MisParser.hx index d2d8917d..fa0e2f94 100644 --- a/src/mis/MisParser.hx +++ b/src/mis/MisParser.hx @@ -1,5 +1,6 @@ package mis; +import src.DifBuilder; import Macros.MisParserMacros; import haxe.Exception; import mis.MissionElement.MissionElementPathedInterior; @@ -33,6 +34,8 @@ final lineCommentRegEx = ~/\/\/.*/g; final assignmentRegEx = ~/(\$(?:\w|\d)+)\s*=\s*(.+?);/g; final marbleAttributesRegEx = ~/setMarbleAttributes\("(\w+)",\s*(.+?)\);/g; final activatePackageRegEx = ~/activatePackage\((.+?)\);/g; +final materialPropertyRegEx = ~/new MaterialProperty *\( *(.+?) *\)\s*{\s*((?:\w+ *= *(\d|\.)+;\s*)*)}/gi; +final addMaterialMappingRegEx = ~/addMaterialMapping *\( *"(.+?)" *, *(.+?) *\)/gi; class MisParser { var text:String; @@ -92,6 +95,51 @@ class MisParser { var activatedPackages = []; startText = outsideText; + var customMaterials = new Map(); + + while (materialPropertyRegEx.match(startText)) { + var materialName = materialPropertyRegEx.matched(1); + var subs = materialPropertyRegEx.matched(2); + + var kvps = new Map(); + var splits = subs.split(';').map(spl -> StringTools.trim(spl).toLowerCase()); + for (prop in splits) { + var kv = prop.split('=').map(spl -> StringTools.trim(spl).toLowerCase()); + kvps.set(kv[0], Std.parseFloat(kv[1])); + } + + var material = { + friction: kvps.get("friction") ?? 1.0, + restitution: kvps.get("restitution") ?? 1.0, + force: kvps.get("force") ?? 0.0 + }; + customMaterials.set(materialName, material); + + startText = materialPropertyRegEx.matchedRight(); + } + + startText = outsideText; + + var materialMappings = new Map(); + while (addMaterialMappingRegEx.match(startText)) { + var mmap = addMaterialMappingRegEx.matched(2); + if (customMaterials.exists(mmap)) + materialMappings.set(addMaterialMappingRegEx.matched(1).toLowerCase(), customMaterials.get(mmap)); + startText = addMaterialMappingRegEx.matchedRight(); + } + + DifBuilder.setCustomMaterialDefinitions(materialMappings); + + startText = outsideText; + while (activatePackageRegEx.match(startText)) { activatedPackages.push(this.resolveExpression(activatePackageRegEx.matched(1))); startText = marbleAttributesRegEx.matchedRight();