コード例 #1
0
        /**
         *  Create surface for overlay
         */
        public ArrayMesh createSurfaceOverlay(ArrayMesh mesh, string slotName, string urlPath, string overlayName, List <UMAReciepeBindPose> origBindPoses)
        {
            var file     = ResourceLoader.Load <PackedScene>(urlPath);
            var instance = file.Instance();
            var meshes   = new List <MeshInstance>();

            if (instance is Spatial)
            {
                foreach (var child in (instance as Spatial).GetChildren())
                {
                    if (child is MeshInstance)
                    {
                        meshes.Add(child as MeshInstance);
                    }
                }
            }

            if (instance is MeshInstance)
            {
                meshes.Add(instance as MeshInstance);
            }

            var mdt = new MeshDataTool();
            var idx = mesh.SurfaceFindByName(slotName);

            mdt.CreateFromSurface(mesh, idx);


            int totalSurfaces = 0;

            foreach (var mi in meshes)
            {
                var newMesh = (mi as MeshInstance).Mesh;
                var newSkin = (mi as MeshInstance).Skin;

                for (int surface = 0; surface < newMesh.GetSurfaceCount(); surface++)
                {
                    mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, createSurfaceByBones(newMesh as ArrayMesh, surface, newSkin, origBindPoses));
                    var lastId = mesh.GetSurfaceCount() - 1;

                    var mat = newMesh.SurfaceGetMaterial(surface);
                    mat.ResourceLocalToScene = true;

                    if (mat is SpatialMaterial)
                    {
                        (mat as SpatialMaterial).ParamsGrow       = true;
                        (mat as SpatialMaterial).ParamsGrowAmount = 0.005f;
                    }

                    mesh.SurfaceSetMaterial(lastId, mat);
                    mesh.SurfaceSetName(lastId, (totalSurfaces == 0) ? overlayName : overlayName + "/" + totalSurfaces);
                    totalSurfaces++;
                }

                changes++;
            }


            return(mesh);
        }
コード例 #2
0
    // Called when the node enters the scene tree for the first time.
    public override void _Ready()
    {
        StreamReader textReader = new StreamReader(@"./UMA/Content/UMA_Core/HumanMale/Slots/Body/UMA_Human_Male_Legs_Slot.asset");

        textReader.ReadLine();
        textReader.ReadLine();
        textReader.ReadLine();
        var deserializer = new DeserializerBuilder()
                           .WithNamingConvention(new CamelCaseNamingConvention())
                           .Build();

        var slotData = deserializer.Deserialize <SlotYaml>(textReader);

        GD.Print(slotData.MonoBehaviour.MName);

        var verticeOrder = decodeUnitysCompressionSubMesh(slotData.MonoBehaviour.MeshData.Submeshes[0].Triangles);
        var surfaceArray = new Godot.Collections.Array();

        surfaceArray.Resize(ARRAY_MAX);
        surfaceArray[ARRAY_VERTEX]   = slotData.MonoBehaviour.MeshData.Vertices;
        surfaceArray[ARRAY_NORMAL]   = slotData.MonoBehaviour.MeshData.Normals;
        surfaceArray[ARRAY_TANGENTS] = CreateTangents(slotData.MonoBehaviour.MeshData.Tangents);
        surfaceArray[ARRAY_TEX_UV]   = slotData.MonoBehaviour.MeshData.Uv;
        surfaceArray[ARRAY_INDEX]    = verticeOrder;

        ArrayMesh legMesh = new ArrayMesh();

        legMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, surfaceArray, null, ARRAY_FORMAT_VERTEX + ARRAY_FORMAT_NORMAL + ARRAY_FORMAT_TANGENT + ARRAY_FORMAT_TANGENT);
        var legMaterial = (SpatialMaterial)GD.Load("res://skin.material");

        GD.Print("Surface Count" + legMesh.GetSurfaceCount());
        var node = (MeshInstance)FindNode("UmaMeshNode");


        GD.Print(node.GetType());
        GD.Print(node.Mesh.ToString());
        legMesh.SurfaceSetMaterial(0, legMaterial);
        node.SetMesh(legMesh);
        GD.Print(node.Mesh.ToString());

        /*
         * DynamicCharacterAvatar characterAvatar= new DynamicCharacterAvatar();
         *
         * DynamicAssetLoader.Instance = new DynamicAssetLoader();
         *
         * UMA.UMAContext.Instance = new UMA.UMAContext();
         * characterAvatar.context = UMA.UMAContext.Instance;
         * UMA.UMAContext.Instance.raceLibrary = new DynamicRaceLibrary();
         *
         * UMATextRecipe textRecipe = new UMATextRecipe();
         * textRecipe.recipeString = @"{""version"":3,""packedSlotDataList"":[],""slotsV2"":[],""slotsV3"":[{""id"":""MaleEyes"",""scale"":100,""copyIdx"":-1,""overlays"":[{""id"":""EyeOverlay"",""colorIdx"":3,""rect"":[0,0,0,0]},{""id"":""Default Eye Adjust"",""colorIdx"":2,""rect"":[0,0,0,0]}]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":""MaleInnerMouth"",""scale"":100,""copyIdx"":-1,""overlays"":[{""id"":""InnerMouth"",""colorIdx"":4,""rect"":[0,0,0,0]}]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":""MaleTorso"",""scale"":100,""copyIdx"":-1,""overlays"":[{""id"":""M_BodOverlay 1"",""colorIdx"":0,""rect"":[0,0,0,0]}]},{""id"":""MaleFeet"",""scale"":100,""copyIdx"":16,""overlays"":[]},{""id"":""MaleHands"",""scale"":100,""copyIdx"":16,""overlays"":[]},{""id"":""MaleLegs"",""scale"":100,""copyIdx"":16,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":"""",""scale"":1,""copyIdx"":-1,""overlays"":[]},{""id"":""M_Highpoly Head"",""scale"":100,""copyIdx"":-1,""overlays"":[{""id"":""M_Face"",""colorIdx"":0,""rect"":[0,0,0,0]}]}],""colors"":[],""fColors"":[{""name"":""Skin"",""colors"":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{""name"":""Hair"",""colors"":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{""name"":""Eyes"",""colors"":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{""name"":""-"",""colors"":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{""name"":""-"",""colors"":[234,234,234,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],""sharedColorCount"":3,""race"":""HumanMale"",""packedDna"":[{""dnaType"":""DynamicUMADna"",""dnaTypeHash"":815443803,""packedDna"":""{\""bDnaAsset\"":{\""instanceID\"":12024},\""bDnaAssetName\"":\""HumanMaleDynamicDnaAsset\"",\""bDnaSettings\"":[{\""name\"":\""skinGreenness\"",\""value\"":128},{\""name\"":\""skinBlueness\"",\""value\"":128},{\""name\"":\""skinRedness\"",\""value\"":128},{\""name\"":\""height\"",\""value\"":128},{\""name\"":\""headSize\"",\""value\"":128},{\""name\"":\""headWidth\"",\""value\"":128},{\""name\"":\""neckThickness\"",\""value\"":128},{\""name\"":\""armLength\"",\""value\"":128},{\""name\"":\""forearmLength\"",\""value\"":128},{\""name\"":\""armWidth\"",\""value\"":128},{\""name\"":\""forearmWidth\"",\""value\"":128},{\""name\"":\""handsSize\"",\""value\"":128},{\""name\"":\""feetSize\"",\""value\"":128},{\""name\"":\""legSeparation\"",\""value\"":128},{\""name\"":\""upperMuscle\"",\""value\"":128},{\""name\"":\""lowerMuscle\"",\""value\"":128},{\""name\"":\""upperWeight\"",\""value\"":128},{\""name\"":\""lowerWeight\"",\""value\"":128},{\""name\"":\""legsSize\"",\""value\"":128},{\""name\"":\""belly\"",\""value\"":128},{\""name\"":\""waist\"",\""value\"":128},{\""name\"":\""gluteusSize\"",\""value\"":128},{\""name\"":\""earsSize\"",\""value\"":128},{\""name\"":\""earsPosition\"",\""value\"":128},{\""name\"":\""earsRotation\"",\""value\"":128},{\""name\"":\""noseSize\"",\""value\"":128},{\""name\"":\""noseCurve\"",\""value\"":128},{\""name\"":\""noseWidth\"",\""value\"":128},{\""name\"":\""noseInclination\"",\""value\"":128},{\""name\"":\""nosePosition\"",\""value\"":128},{\""name\"":\""nosePronounced\"",\""value\"":128},{\""name\"":\""noseFlatten\"",\""value\"":128},{\""name\"":\""chinSize\"",\""value\"":128},{\""name\"":\""chinPronounced\"",\""value\"":128},{\""name\"":\""chinPosition\"",\""value\"":128},{\""name\"":\""mandibleSize\"",\""value\"":128},{\""name\"":\""jawsSize\"",\""value\"":128},{\""name\"":\""jawsPosition\"",\""value\"":128},{\""name\"":\""cheekSize\"",\""value\"":128},{\""name\"":\""cheekPosition\"",\""value\"":128},{\""name\"":\""lowCheekPronounced\"",\""value\"":128},{\""name\"":\""lowCheekPosition\"",\""value\"":128},{\""name\"":\""foreheadSize\"",\""value\"":128},{\""name\"":\""foreheadPosition\"",\""value\"":128},{\""name\"":\""lipsSize\"",\""value\"":128},{\""name\"":\""mouthSize\"",\""value\"":128},{\""name\"":\""eyeRotation\"",\""value\"":128},{\""name\"":\""eyeSize\"",\""value\"":128},{\""name\"":\""breastSize\"",\""value\"":128},{\""name\"":\""eyeSpacing\"",\""value\"":128}]}""}],""wardrobeSet"":[],""packedRecipeType"":""Standard""}";
         * GD.Print(textRecipe.recipeString);
         * characterAvatar.umaRecipe = textRecipe;
         *
         * UMAGenerator generator = new UMAGenerator();
         * characterAvatar.umaGenerator = generator;
         *
         * characterAvatar.Start();
         * GD.Print("It actually made it to the end of the Start routine!");*/
    }
コード例 #3
0
    void apply_color(ArrayMesh am)
    {
        int surface_count = am.GetSurfaceCount();

        SpatialMaterial[] mats = make_materials(surface_count);
        for (int i = 0; i < surface_count; i++)
        {
            am.SurfaceSetMaterial(i, mats[i]);
        }
    }
コード例 #4
0
    private void GenerateMesh()
    {
        ArrayMesh mesh = MeshGenerator.GenerateMesh(noiseMap, MeshHeightMultiplier, MeshHeightCurve, LevelOfDetail);
        MeshInstance meshInstance = GetNode<MeshInstance>("MeshInstance");
        meshInstance.Mesh = mesh;
        meshInstance.CreateTrimeshCollision();

        SpatialMaterial material = new SpatialMaterial();
        material.AlbedoTexture = TextureGenerator.GenerateColorTexture(noiseMap, RegionThresholds, RegionColors);
        mesh.SurfaceSetMaterial(0, material);
    }
コード例 #5
0
    public void SetMaterial(Material material)
    {
        if (meshInstance == null)
        {
            GD.Print(name + " has no mesh to set material to");
            return;
        }
        ArrayMesh mesh = meshInstance.Mesh as ArrayMesh;

        mesh.SurfaceSetMaterial(0, material);
    }
コード例 #6
0
    // Apply the default material on each surface
    private static void ApplyMaterial(ArrayMesh mesh)
    {
        if (DefaultMaterial is null)
        {
            DefaultMaterial = (SpatialMaterial)ResourceLoader.Load(DefaultMaterialPath);
        }

        // Apply the material on each surface
        for (int i = 0; i < mesh.GetSurfaceCount(); i++)
        {
            mesh.SurfaceSetMaterial(i, DefaultMaterial);
        }
    }
コード例 #7
0
    protected void assignMaterialOverlay(ArrayMesh oldMesh, string overlayName, bool useAlbedo, Color albedoColor, string materialPath, float glow)
    {
        if (oldMesh == null)
        {
            return;
        }

        for (int surface = 0; surface < oldMesh.GetSurfaceCount(); surface++)
        {
            var name = oldMesh.SurfaceGetName(surface);

            if (!name.Contains(overlayName))
            {
                continue;
            }

            var material = oldMesh.SurfaceGetMaterial(surface);
            if (!String.IsNullOrEmpty(materialPath))
            {
                //fix path combine (system.io)
                materialPath = materialPath.Replace(@"\", @"/");

                if ((material == null) || (material.ResourcePath != materialPath))
                {
                    var newMaterial = GD.Load <Material>(materialPath);

                    if (newMaterial is SpatialMaterial)
                    {
                        (newMaterial as SpatialMaterial).ParamsGrow       = true;
                        (newMaterial as SpatialMaterial).ParamsGrowAmount = glow;
                    }

                    newMaterial.ResourceLocalToScene = true;
                    material = newMaterial;
                }
            }

            if (material != null)
            {
                if (useAlbedo)
                {
                    (material as SpatialMaterial).AlbedoColor = albedoColor;
                }

                (material as SpatialMaterial).ParamsGrow       = true;
                (material as SpatialMaterial).ParamsGrowAmount = glow;

                oldMesh.SurfaceSetMaterial(surface, material);
            }
        }
    }
コード例 #8
0
        /**
         *  Create surface overlay
         */
        public ArrayMesh createSurface(ArrayMesh mesh, string urlPath, string overlayName)
        {
            var file     = ResourceLoader.Load <PackedScene>(urlPath);
            var instance = file.Instance();
            var meshes   = new List <MeshInstance>();

            if (instance is Spatial)
            {
                foreach (var child in (instance as Spatial).GetChildren())
                {
                    if (child is MeshInstance)
                    {
                        meshes.Add(child as MeshInstance);
                    }
                }
            }

            if (instance is MeshInstance)
            {
                meshes.Add(instance as MeshInstance);
            }

            int totalSurfaces = 0;

            foreach (var mi in meshes)
            {
                var newMesh = (mi as MeshInstance).Mesh;
                for (int surface = 0; surface < newMesh.GetSurfaceCount(); surface++)
                {
                    mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, newMesh.SurfaceGetArrays(surface));
                    var lastId = mesh.GetSurfaceCount() - 1;

                    var mat = newMesh.SurfaceGetMaterial(surface);
                    mat.ResourceLocalToScene = true;
                    mesh.SurfaceSetMaterial(lastId, mat);
                    mesh.SurfaceSetName(lastId, (totalSurfaces == 0) ? overlayName : overlayName + "/" + totalSurfaces);
                    totalSurfaces++;
                }

                changes++;
            }


            return(mesh);
        }
コード例 #9
0
ファイル: TDF.cs プロジェクト: GiantBlargg/Whirled
    static Mesh[] LoadMesh(string modelPath, Vector2 textureScale)
    {
        TDFMaterialFactory materialFactory = new TDFMaterialFactory(modelPath);

        var terrDataPath = LR2Dir.ResolvePath(modelPath + "/TERRDATA.TDF");
        var file         = new File();

        file.Open(terrDataPath, File.ModeFlags.Read);

        file.Seek(0x10);

        var heightScale = file.GetFloat();

        var meshes = new ArrayMesh[NUM_CHUNKS * NUM_CHUNKS];

        for (int i = 0; i < NUM_CHUNKS * NUM_CHUNKS; i++)
        {
            if (i == 0x3A2)
            {
                GD.Print();
            }
            file.Seek(0x3AE020 + i * 4);
            var surfaceOffset = file.Get32();
            file.Seek(0x366020 + surfaceOffset + 3 * 4);
            ushort xPos = file.Get16();
            ushort yPos = file.Get16();

            file.Seek(0x366020 + surfaceOffset + 0x90);
            uint verticiesOffset = file.Get32();

            file.Seek(0x20 + verticiesOffset);
            var mesh = new ArrayMesh();
            BuildSection(file, xPos, yPos, heightScale, textureScale, ref mesh);

            file.Seek(0x366020 + surfaceOffset + 0x118);
            byte[] textureIDs = file.GetBuffer(4);

            var mat = materialFactory.GetMaterial(textureIDs);
            mesh.SurfaceSetMaterial(0, mat);

            meshes[i] = mesh;
        }

        return(meshes);
    }
コード例 #10
0
    public void InitTerrain(string terrainFile)
    {
        PackedScene ps       = (PackedScene)GD.Load(terrainFile);
        Node        instance = ps.Instance();

        AddChild(instance);
        terrain = (Spatial)instance;

        // Everything below this line is a dirty hack to work around a bug.
        GridMap gm = Util.GetChildByName(terrain, "Map") as GridMap;

        MeshLibrary    theme  = gm.Theme;
        List <Vector3> colors = new List <Vector3> {
            new Vector3(0.537f, 0.101f, 0.101f),
            new Vector3(0.141f, 0.313f, 0.125f),
            new Vector3(0.137f, 0.215f, 0.521f),
            new Vector3(0.690f, 0.321f, 0.129f),
            new Vector3(0.490f, 0.168f, 0.490f),
            new Vector3(0.717f, 0.694f, 0.203f),
            new Vector3(1, 1, 1),
            new Vector3(0, 0, 0)
        };

        for (int i = 0; i < 8; i++)
        {
            ArrayMesh       arrMesh  = theme.GetItemMesh(i) as ArrayMesh;
            SpatialMaterial material = GFX.GetColorSpatialMaterial(colors[i]) as SpatialMaterial;

            material.EmissionEnabled = true;
            material.Emission        = GFX.Color(colors[i]);
            material.EmissionEnergy  = 0.5f;

            material.TransmissionEnabled = true;
            material.Transmission        = GFX.Color(colors[i]);

            material.RefractionEnabled = false;

            material.Metallic = 1f;

            material.Roughness = 0.5f;

            arrMesh.SurfaceSetMaterial(0, material);
        }
    }
コード例 #11
0
        public static void CopyTo(this IMeshSurface surface, ArrayMesh target)
        {
            Ensure.That(surface, nameof(surface)).IsNotNull();
            Ensure.That(surface, nameof(surface)).IsNotNull();

            var index = target.SurfaceFindByName(surface.Key);

            if (index != -1)
            {
                target.SurfaceRemove(index);
            }

            var existingShapes = target.GetBlendShapeNames().ToHashSet();

            surface.BlendShapes.Map(b => b.Key).Filter(k => !existingShapes.Contains(k)).Iter(target.AddBlendShape);

            target.BlendShapeMode = surface.BlendShapeMode;

            var newIndex = target.GetSurfaceCount();

            Array CopyBlendShape(IMeshData <MorphableVertex> source)
            {
                var shape = new Array();

                source.Export()
                .Cast <object>()
                .Map((i, a) => i == (int)ArrayMesh.ArrayType.Index ? null : a)
                .Iter(a => shape.Add(a));

                return(shape);
            }

            var data   = surface.Data.Export();
            var shapes = new Array(surface.BlendShapes.Map(CopyBlendShape));

            target.AddSurfaceFromArrays(surface.PrimitiveType, data, shapes);
            target.SurfaceSetName(newIndex, surface.Key);

            surface.Material.Iter(m => target.SurfaceSetMaterial(newIndex, m));
        }
コード例 #12
0
    public static void Read(Node node, Stream fs, out List <Tuple <SpatialMaterial, Texture[], float> > animat)
    {
        var zip      = new ZipFile(fs);
        var zonefile = zip.GetInputStream(zip.GetEntry("zone.oez"));
        var reader   = new BinaryReader(zonefile);

        var nummats   = reader.ReadInt32();
        var materials = new Dictionary <int, SpatialMaterial>();
        var hidden    = new Dictionary <int, bool>();

        animat = new List <Tuple <SpatialMaterial, Texture[], float> >();
        for (var i = 0; i < nummats; ++i)
        {
            var flags    = reader.ReadUInt32();
            var param    = reader.ReadUInt32();
            var numtex   = reader.ReadUInt32();
            var textures = new Texture[numtex];
            for (var j = 0; j < numtex; ++j)
            {
                var fn    = reader.ReadString();
                var entry = zip.GetEntry(fn);
                textures[j] = TextureLoader.Load(zip.GetInputStream(entry), (int)entry.Size, flags != 1);
            }
            hidden[i] = flags == 4;
            var mat = materials[i] = new SpatialMaterial();
            if (numtex > 1)
            {
                animat.Add(new Tuple <SpatialMaterial, Texture[], float>(mat, textures, param));
            }
            else if (numtex == 1)
            {
                mat.AlbedoTexture = textures[0];
            }
            if (flags == 1)
            {
                mat.ParamsUseAlphaScissor = true;
            }
            else if (flags != 0)
            {
                mat.FlagsTransparent = true;
            }
        }

        var objects = new List <ArrayMesh>();
        var colobjs = new List <ArrayMesh>();
        var numobjs = reader.ReadUInt32();

        WriteLine($"Num objs: {numobjs}");
        for (var i = 0; i < numobjs; ++i)
        {
            var obj    = new ArrayMesh();
            var colobj = new ArrayMesh();
            objects.Add(obj);
            colobjs.Add(colobj);
            var matoffs = new List <int>();

            var nummeshes = reader.ReadUInt32();
            WriteLine($"Num meshes: {nummeshes}");
            var surfid       = 0;
            var hasCollision = false;
            for (var j = 0; j < nummeshes; ++j)
            {
                var matid      = reader.ReadInt32();
                var collidable = reader.ReadUInt32() == 1;
                var numvert    = reader.ReadInt32();
                var arrays     = new object[ArrayMesh.ARRAY_MAX];
                arrays[ArrayMesh.ARRAY_VERTEX] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
                arrays[ArrayMesh.ARRAY_NORMAL] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
                arrays[ArrayMesh.ARRAY_TEX_UV] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector2()).ToArray();
                var numpoly = reader.ReadInt32();
                var ind     = Enumerable.Range(0, numpoly * 3).Select(_ => (int)reader.ReadUInt32()).ToArray();
                arrays[ArrayMesh.ARRAY_INDEX] = ind;

                if (collidable)
                {
                    colobj.AddSurfaceFromArrays(VisualServer.PRIMITIVE_TRIANGLES, arrays);
                    hasCollision = true;
                }

                if (hidden[matid])
                {
                    continue;
                }

                obj.AddSurfaceFromArrays(VisualServer.PRIMITIVE_TRIANGLES, arrays);
                obj.SurfaceSetMaterial(surfid++, materials[matid]);
            }

            if (!hasCollision)
            {
                colobjs[i] = null;
            }
        }
        WriteLine("Building base meshinstance");

        var mi = new MeshInstance {
            Mesh = objects[0]
        };

        node.AddChild(mi);

        if (colobjs[0] != null)
        {
            var cmi = new MeshInstance {
                Mesh = colobjs[0]
            };
            cmi.CreateTrimeshCollision();
            var body = cmi.GetChild(0);
            cmi.RemoveChild(body);
            node.AddChild(body);
        }

        WriteLine("Adding placeables");

        var oset = new List <Transform> [objects.Count - 1];

        for (var i = 0; i < oset.Length; ++i)
        {
            oset[i] = new List <Transform>();
        }
        var numplace = reader.ReadUInt32();

        for (var i = 0; i < numplace; ++i)
        {
            var ind = reader.ReadInt32();
            //WriteLine($"Placeable {i} has index {ind} / {objects.Count}");
            var pos   = reader.ReadVector3();
            var rot   = reader.ReadVector3();
            var size  = reader.ReadVector3();
            var quat  = rot.EulerToQuat();
            var trans = new Transform(new Basis(
                                          quat.xform(new Vector3(1, 0, 0)) * size.x,
                                          quat.xform(new Vector3(0, 1, 0)) * size.y,
                                          quat.xform(new Vector3(0, 0, 1)) * size.z
                                          ), pos);
            oset[ind - 1].Add(trans);
        }
        WriteLine("Parsed ...");
        for (var i = 1; i < numobjs; ++i)
        {
            WriteLine($"Handling placeable {i}/{numobjs}");
            var set = oset[i - 1];
            if (set.Count < 100)              // XXX: Add collision support for multimeshes
            {
                foreach (var trans in set)
                {
                    mi = new MeshInstance()
                    {
                        Mesh = objects[i], Transform = trans
                    };
                    node.AddChild(mi);

                    if (colobjs[i] != null)
                    {
                        var cmi = new MeshInstance()
                        {
                            Mesh = colobjs[i]
                        };
                        cmi.CreateTrimeshCollision();
                        var body = (Spatial)cmi.GetChild(0);
                        cmi.RemoveChild(body);
                        body.Transform = trans;
                        node.AddChild(body);
                    }
                }
            }
            else
            {
                var mmesh = new MultiMesh {
                    TransformFormat = MultiMesh.TRANSFORM_3D,
                    Mesh            = objects[i],
                    InstanceCount   = set.Count
                };
                node.AddChild(new MultiMeshInstance()
                {
                    Multimesh = mmesh
                });

                if (colobjs[i] != null)
                {
                    var cmi = new MeshInstance()
                    {
                        Mesh = colobjs[i]
                    };
                    cmi.CreateTrimeshCollision();
                    var body = (StaticBody)cmi.GetChild(0);
                    cmi.RemoveChild(body);
                    foreach (var trans in set)
                    {
                        var cloned = (StaticBody)body.Duplicate(flags: 0);
                        cloned.Transform = trans;
                        node.AddChild(cloned);
                    }
                }

                for (var j = 0; j < set.Count; ++j)
                {
                    mmesh.SetInstanceTransform(j, set[j]);
                }
            }
        }

        WriteLine("Done loading ... ?");
    }
コード例 #13
0
ファイル: MobModel.cs プロジェクト: ns-mkusper/OpenEQ
    public static MobModel Read(Stream fs)
    {
        var zip      = new ZipFile(fs);
        var zonefile = zip.GetInputStream(zip.GetEntry("ORC_ACTORDEF.oec"));
        var reader   = new BinaryReader(zonefile);

        var obj       = new ArrayMesh();
        var nummeshes = reader.ReadInt32();

        for (var i = 0; i < nummeshes; ++i)
        {
            var flags    = reader.ReadUInt32();
            var numtex   = reader.ReadUInt32();
            var textures = new Texture[numtex];
            for (var j = 0; j < numtex; ++j)
            {
                var fn    = reader.ReadString();
                var entry = zip.GetEntry(fn);
                textures[j] = TextureLoader.Load(zip.GetInputStream(entry), (int)entry.Size, flags != 1);
            }
            var mat = new SpatialMaterial();
            if (numtex > 0)
            {
                mat.AlbedoTexture = textures[0];
            }
            if (flags == 1)
            {
                mat.ParamsUseAlphaScissor = true;
            }
            //else if(flags != 0)
            //	mat.FlagsTransparent = true;

            var numvert = reader.ReadInt32();
            var arrays  = new object[ArrayMesh.ARRAY_MAX];
            arrays[ArrayMesh.ARRAY_VERTEX]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
            arrays[ArrayMesh.ARRAY_NORMAL]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray();
            arrays[ArrayMesh.ARRAY_TEX_UV]  = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector2()).ToArray();
            arrays[ArrayMesh.ARRAY_BONES]   = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? reader.ReadUInt32() : 0f).ToArray();
            arrays[ArrayMesh.ARRAY_WEIGHTS] = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? 1f : 0f).ToArray();
            var numpoly = reader.ReadInt32();
            var ind     = Enumerable.Range(0, numpoly * 3).Select(_ => (int)reader.ReadUInt32()).ToArray();
            arrays[ArrayMesh.ARRAY_INDEX] = ind;
            obj.AddSurfaceFromArrays(VisualServer.PRIMITIVE_TRIANGLES, arrays);
            obj.SurfaceSetMaterial(i, mat);
        }

        var sp = new Spatial();

        var numbones = reader.ReadUInt32();
        var skel     = new Skeleton();

        skel.RotateX(-Mathf.PI / 2);
        sp.AddChild(skel);
        skel.SetName("skel");
        for (var i = 0; i < numbones; ++i)
        {
            skel.AddBone($"bone_{i}");
            skel.SetBoneParent(i, reader.ReadInt32());
        }

        var numanim   = reader.ReadUInt32();
        var aniplayer = new AnimationPlayer();

        aniplayer.SetName("aniplayer");
        for (var i = 0; i < numanim; ++i)
        {
            var name       = reader.ReadString();
            var ani        = new Animation();
            var boneframes = new List <Tuple <Vector3, Quat> > [numbones];
            for (var j = 0; j < numbones; ++j)
            {
                ani.AddTrack(Animation.TYPE_TRANSFORM);
                ani.TrackSetPath(j, $"skel:bone_{j}");
                var numframes = reader.ReadUInt32();
                for (var k = 0; k < numframes; ++k)
                {
                    ani.TransformTrackInsertKey(j, 0.1f * k, reader.ReadVector3(), reader.ReadQuat(), new Vector3(1, 1, 1));
                }
            }
            aniplayer.AddAnimation(name, ani);
        }

        sp.AddChild(aniplayer);
        aniplayer.SetActive(true);
        aniplayer.Play("C09");

        var mi = new MeshInstance {
            Mesh = obj
        };

        skel.AddChild(mi);

        return(new MobModel(sp));
    }
コード例 #14
0
    public void SetMaterial(Material material)
    {
        ArrayMesh mesh = meshInstance.Mesh as ArrayMesh;

        mesh.SurfaceSetMaterial(0, material);
    }