diff --git a/data/interiors_mbu/intermediate/sporkintheroad.dif b/data/interiors_mbu/intermediate/sporkintheroad.dif index f0945155..9f6bce89 100644 Binary files a/data/interiors_mbu/intermediate/sporkintheroad.dif and b/data/interiors_mbu/intermediate/sporkintheroad.dif differ diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index 52a149f3..f1e29748 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -211,6 +211,12 @@ class DifBuilder { } ]; + static var customMaterialDict:Map = []; + static function createPhongMaterial(onFinish:hxsl.Shader->Void, baseTexture:String, normalTexture:String, shininess:Float, specularColor:Vector, uvScaleFactor:Float = 1) { var worker = new ResourceLoaderWorker(() -> { @@ -381,6 +387,10 @@ class DifBuilder { 'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'), ]; + public static function setCustomMaterialDefinitions(materials:Map) { + customMaterialDict = materials; + } + public static function loadDif(path:String, itr:InteriorObject, onFinish:Void->Void, ?so:Int = -1) { #if (js || android) path = StringTools.replace(path, "data/", ""); @@ -493,12 +503,21 @@ class DifBuilder { tri.uv3 = uv3; triangles.push(tri); var materialName = stripTexName(texture).toLowerCase(); - var hasMaterialInfo = materialDict.exists(materialName); - if (hasMaterialInfo) { - var minfo = materialDict.get(materialName); + + 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; + } } colliderSurface.addPoint(-p1.x, p1.y, p1.z); colliderSurface.addPoint(-p2.x, p2.y, p2.z); diff --git a/src/mis/MisParser.hx b/src/mis/MisParser.hx index fd1c0b9a..99aeefb9 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; @@ -31,6 +32,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; @@ -71,6 +74,49 @@ 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); + // while (activatePackageRegEx.match(startText)) { // activatedPackages.push(this.resolveExpression(activatePackageRegEx.matched(1))); // startText = marbleAttributesRegEx.matchedRight();