Exemplo n.º 1
0
    public List <string> BuildWorld(Transform cameraPivot, VoxelArray voxelArray, bool editor)
    {
        var warnings = ReadWorldFile.Read(Resources.Load <TextAsset>("Templates/indoor"),
                                          cameraPivot, voxelArray, editor);

        foreach (var obj in voxelArray.IterateObjects())
        {
            if (obj is PlayerObject)
            {
                var behavior = new SoundBehavior();
                behavior.SetProperty("dat", data);
                obj.behaviors.Add(behavior);
                break;
            }
        }
        return(warnings);
    }
Exemplo n.º 2
0
    private JSONObject WriteWorld(VoxelArray voxelArray)
    {
        JSONObject world = new JSONObject();

        JSONArray materialsArray  = new JSONArray();
        var       foundMaterials  = new List <string>();
        JSONArray substancesArray = new JSONArray();
        var       foundSubstances = new List <Substance>();

        foreach (Voxel voxel in voxelArray.IterateVoxels())
        {
            foreach (VoxelFace face in voxel.faces)
            {
                AddMaterial(face.material, foundMaterials, materialsArray);
                AddMaterial(face.overlay, foundMaterials, materialsArray);
            }
            if (voxel.substance != null && !foundSubstances.Contains(voxel.substance))
            {
                foundSubstances.Add(voxel.substance);
                substancesArray[-1] = WriteEntity(voxel.substance, false);
            }
        }

        world["materials"] = materialsArray;
        if (foundSubstances.Count != 0)
        {
            world["substances"] = substancesArray;
        }
        world["global"] = WritePropertiesObject(voxelArray.world, false);
        world["map"]    = WriteMap(voxelArray, foundMaterials, foundSubstances);

        JSONArray objectsArray = new JSONArray();

        foreach (ObjectEntity obj in voxelArray.IterateObjects())
        {
            objectsArray[-1] = WriteObjectEntity(obj, true);
        }
        if (objectsArray.Count != 0)
        {
            world["objects"] = objectsArray;
        }

        return(world);
    }
Exemplo n.º 3
0
    private static MessagePackObjectDictionary WriteWorld(Transform cameraPivot, VoxelArray voxelArray)
    {
        var world = new MessagePackObjectDictionary();

        world[FileKeys.WORLD_WRITER_VERSION]     = VERSION;
        world[FileKeys.WORLD_MIN_READER_VERSION] = FILE_MIN_READER_VERSION;

        world[FileKeys.WORLD_TYPE] = (int)voxelArray.type;

        world[FileKeys.WORLD_CAMERA] = new MessagePackObject(WriteCamera(cameraPivot));

        var materialsList   = new List <MessagePackObject>();
        var foundMaterials  = new List <string>();
        var overlaysList    = new List <MessagePackObject>();
        var foundOverlays   = new List <string>();
        var substancesList  = new List <MessagePackObject>();
        var foundSubstances = new List <Substance>();

        foreach (Voxel voxel in voxelArray.IterateVoxels())
        {
            foreach (VoxelFace face in voxel.faces)
            {
                AddMaterial(face.material, foundMaterials, materialsList);
                AddMaterial(face.overlay, foundOverlays, overlaysList);
            }
            if (voxel.substance != null && !foundSubstances.Contains(voxel.substance))
            {
                foundSubstances.Add(voxel.substance);
                substancesList.Add(new MessagePackObject(WriteEntity(voxel.substance, false)));
            }
        }

        world[FileKeys.WORLD_MATERIALS] = new MessagePackObject(materialsList);
        world[FileKeys.WORLD_OVERLAYS]  = new MessagePackObject(overlaysList);
        if (foundSubstances.Count != 0)
        {
            world[FileKeys.WORLD_SUBSTANCES] = new MessagePackObject(substancesList);
        }
        world[FileKeys.WORLD_GLOBAL] = new MessagePackObject(WritePropertiesObject(voxelArray.world, false));

        var voxelsList = new List <MessagePackObject>();

        foreach (Voxel voxel in voxelArray.IterateVoxels())
        {
            if (voxel.CanBeDeleted())
            {
                Debug.Log("Empty voxel found!");
                continue;
            }
            voxelsList.Add(WriteVoxel(voxel, foundMaterials, foundOverlays, foundSubstances));
        }
        world[FileKeys.WORLD_VOXELS] = new MessagePackObject(voxelsList);

        var objectsList = new List <MessagePackObject>();

        foreach (ObjectEntity obj in voxelArray.IterateObjects())
        {
            objectsList.Add(new MessagePackObject(WriteObjectEntity(obj, true)));
        }
        if (objectsList.Count != 0)
        {
            world[FileKeys.WORLD_OBJECTS] = new MessagePackObject(objectsList);
        }

        return(world);
    }
Exemplo n.º 4
0
    private void ReadWorld(MessagePackObjectDictionary world, Transform cameraPivot, VoxelArray voxelArray)
    {
        if (editor && cameraPivot != null && world.ContainsKey(FileKeys.WORLD_CAMERA))
        {
            ReadCamera(world[FileKeys.WORLD_CAMERA].AsDictionary(), cameraPivot);
        }

        var materials = new List <Material>();

        if (world.ContainsKey(FileKeys.WORLD_MATERIALS))
        {
            foreach (var matObj in world[FileKeys.WORLD_MATERIALS].AsList())
            {
                materials.Add(ReadMaterial(matObj.AsDictionary(), false));
            }
        }

        var overlays = new List <Material>();

        if (world.ContainsKey(FileKeys.WORLD_OVERLAYS))
        {
            foreach (var matObj in world[FileKeys.WORLD_OVERLAYS].AsList())
            {
                overlays.Add(ReadMaterial(matObj.AsDictionary(), true));
            }
        }

        var substances = new List <Substance>();

        if (world.ContainsKey(FileKeys.WORLD_SUBSTANCES))
        {
            foreach (var subObj in world[FileKeys.WORLD_SUBSTANCES].AsList())
            {
                Substance s = new Substance();
                ReadEntity(subObj.AsDictionary(), s);
                substances.Add(s);
            }
        }

        if (world.ContainsKey(FileKeys.WORLD_GLOBAL))
        {
            ReadPropertiesObject(world[FileKeys.WORLD_GLOBAL].AsDictionary(), voxelArray.world);
        }

        if (world.ContainsKey(FileKeys.WORLD_VOXELS))
        {
            foreach (var voxelObj in world[FileKeys.WORLD_VOXELS].AsList())
            {
                ReadVoxel(voxelObj, voxelArray, materials, overlays, substances);
            }
        }

        if (world.ContainsKey(FileKeys.WORLD_OBJECTS))
        {
            foreach (var objObj in world[FileKeys.WORLD_OBJECTS].AsList())
            {
                var    objDict  = objObj.AsDictionary();
                string typeName = objDict[FileKeys.PROPOBJ_NAME].AsString();
                var    objType  = GameScripts.FindTypeWithName(GameScripts.objects, typeName);
                if (objType == null)
                {
                    warnings.Add("Unrecognized object type: " + typeName);
                    continue;
                }
                ObjectEntity obj = (ObjectEntity)objType.Create();
                ReadObjectEntity(objDict, obj);
                voxelArray.AddObject(obj);
            }
        }

        if (!editor)
        {
            // start the game
            foreach (Substance s in substances)
            {
                s.InitEntityGameObject(voxelArray);
            }
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitEntityGameObject(voxelArray);
            }
        }
        else // editor
        {
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitObjectMarker((VoxelArrayEditor)voxelArray);
            }
        }
    }
Exemplo n.º 5
0
    private void ReadWorld(JSONObject world, VoxelArray voxelArray)
    {
        var materials = new List <Material>();

        if (world["materials"] != null)
        {
            foreach (JSONNode matNode in world["materials"].AsArray)
            {
                JSONObject matObject = matNode.AsObject;
                materials.Add(ReadMaterial(matObject));
            }
        }

        var substances = new List <Substance>();

        if (world["substances"] != null)
        {
            foreach (JSONNode subNode in world["substances"].AsArray)
            {
                Substance s = new Substance();
                ReadEntity(subNode.AsObject, s);
                substances.Add(s);
            }
        }

        if (world["global"] != null)
        {
            ReadPropertiesObject(world["global"].AsObject, voxelArray.world);
        }
        if (fileWriterVersion <= 2 && world["sky"] != null)
        {
            Material sky = materials[world["sky"].AsInt];
            if (sky != ReadWorldFile.missingMaterial) // default skybox is null
            {
                voxelArray.world.SetSky(sky);
            }
        }
        if (world["map"] != null)
        {
            ReadMap(world["map"].AsObject, voxelArray, materials, substances);
        }
        if (fileWriterVersion <= 2 && world["player"] != null)
        {
            PlayerObject player = new PlayerObject();
            ReadObjectEntity(world["player"].AsObject, player);
            voxelArray.AddObject(player);
        }
        if (world["objects"] != null)
        {
            foreach (JSONNode objNode in world["objects"].AsArray)
            {
                JSONObject objObject = objNode.AsObject;
                string     typeName  = objObject["name"];
                var        objType   = GameScripts.FindTypeWithName(GameScripts.objects, typeName);
                if (objType == null)
                {
                    warnings.Add("Unrecognized object type: " + typeName);
                    continue;
                }
                ObjectEntity obj = (ObjectEntity)objType.Create();
                ReadObjectEntity(objObject, obj);
                voxelArray.AddObject(obj);
            }
        }

        if (!editor)
        {
            // start the game
            foreach (Substance s in substances)
            {
                s.InitEntityGameObject(voxelArray);
            }
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitEntityGameObject(voxelArray);
            }
        }
        else // editor
        {
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitObjectMarker((VoxelArrayEditor)voxelArray);
            }
        }
    }
Exemplo n.º 6
0
    private void ReadWorld(MessagePackObjectDictionary world, Transform cameraPivot, VoxelArray voxelArray)
    {
        if (world.ContainsKey(FileKeys.WORLD_TYPE))
        {
            voxelArray.type = (VoxelArray.WorldType)world[FileKeys.WORLD_TYPE].AsInt32();
        }

        if (editor && cameraPivot != null && world.ContainsKey(FileKeys.WORLD_CAMERA))
        {
            ReadCamera(world[FileKeys.WORLD_CAMERA].AsDictionary(), cameraPivot);
        }

        var customMaterialNames = new Dictionary <string, Material>();

        voxelArray.customMaterials = new List <Material>();
        if (world.ContainsKey(FileKeys.WORLD_CUSTOM_MATERIALS))
        {
            foreach (var texObj in world[FileKeys.WORLD_CUSTOM_MATERIALS].AsList())
            {
                voxelArray.customMaterials.Add(
                    ReadCustomTexture(texObj.AsDictionary(), customMaterialNames, false));
            }
        }

        var customOverlayNames = new Dictionary <string, Material>();

        voxelArray.customOverlays = new List <Material>();
        if (world.ContainsKey(FileKeys.WORLD_CUSTOM_OVERLAYS))
        {
            foreach (var texObj in world[FileKeys.WORLD_CUSTOM_OVERLAYS].AsList())
            {
                voxelArray.customOverlays.Add(
                    ReadCustomTexture(texObj.AsDictionary(), customOverlayNames, true));
            }
        }

        var materials = new List <Material>();

        if (world.ContainsKey(FileKeys.WORLD_MATERIALS))
        {
            foreach (var matObj in world[FileKeys.WORLD_MATERIALS].AsList())
            {
                materials.Add(ReadMaterial(matObj.AsDictionary(), false, customMaterialNames));
            }
        }

        var overlays = new List <Material>();

        if (world.ContainsKey(FileKeys.WORLD_OVERLAYS))
        {
            foreach (var matObj in world[FileKeys.WORLD_OVERLAYS].AsList())
            {
                overlays.Add(ReadMaterial(matObj.AsDictionary(), true, customOverlayNames));
            }
        }

        var substances = new List <Substance>();

        if (world.ContainsKey(FileKeys.WORLD_SUBSTANCES))
        {
            foreach (var subObj in world[FileKeys.WORLD_SUBSTANCES].AsList())
            {
                Substance s = new Substance();
                ReadEntity(subObj.AsDictionary(), s);
                substances.Add(s);
            }
        }

        if (world.ContainsKey(FileKeys.WORLD_GLOBAL))
        {
            ReadPropertiesObject(world[FileKeys.WORLD_GLOBAL].AsDictionary(), voxelArray.world);
            // the new skybox shader makes ambient light for this sky a lot brighter
            if (fileWriterVersion <= 10 && RenderSettings.skybox.name == "sky5X3")
            {
                RenderSettings.ambientIntensity *= 0.67f;
            }
        }

        if (world.ContainsKey(FileKeys.WORLD_VOXELS))
        {
            foreach (var voxelObj in world[FileKeys.WORLD_VOXELS].AsList())
            {
                ReadVoxel(voxelObj, voxelArray, materials, overlays, substances);
            }
        }

        if (world.ContainsKey(FileKeys.WORLD_OBJECTS))
        {
            foreach (var objObj in world[FileKeys.WORLD_OBJECTS].AsList())
            {
                var    objDict  = objObj.AsDictionary();
                string typeName = objDict[FileKeys.PROPOBJ_NAME].AsString();
                var    objType  = GameScripts.FindTypeWithName(GameScripts.objects, typeName);
                if (objType == null)
                {
                    warnings.Add("Unrecognized object type: " + typeName);
                    continue;
                }
                ObjectEntity obj = (ObjectEntity)objType.Create();
                ReadObjectEntity(objDict, obj, materials, overlays);
                voxelArray.AddObject(obj);
            }
        }

        if (!editor)
        {
            // start the game
            foreach (Substance s in substances)
            {
                s.InitEntityGameObject(voxelArray);
            }
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitEntityGameObject(voxelArray);
            }
        }
        else // editor
        {
            foreach (ObjectEntity obj in voxelArray.IterateObjects())
            {
                obj.InitObjectMarker((VoxelArrayEditor)voxelArray);
            }
        }
    }