Ejemplo n.º 1
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            var fileName = System.IO.Path.GetFileNameWithoutExtension(ctx.assetPath);

            var go        = new GameObject(fileName);
            var usdStream = go.AddComponent <UsdStream>();

            usdStream.importSettings = new usdi.ImportSettings()
            {
                interpolation      = m_importSettings.interpolation,
                normalCalculation  = m_importSettings.normalCalculation,
                tangentCalculation = m_importSettings.tangentCalculation,
                maxBoneWeights     = m_importSettings.maxBoneWeights,
                scale           = m_importSettings.scale,
                loadAllPayloads = true,
                triangulate     = true,
                swapHandedness  = m_importSettings.swapHandedness,
                swapFaces       = m_importSettings.swapFaces,
                splitMesh       = true,
                doubleBuffering = true,
            };
            usdStream.directVBUpdate    = m_directVBUpdate;
            usdStream.forceSingleThread = m_forceSingleThread;
            usdStream.timeUnit          = m_timeUnit;
            usdStream.playTime          = m_time;

            usdStream.LoadImmediate(ctx.assetPath);

            var material = new Material(Shader.Find("Standard"))
            {
            };

            material.name = "Material_0";
            ctx.AddSubAsset("Default Material", material);
            _subObjects = new SortedDictionary <int, UnityEngine.Object>();
            CollectSubAssets(go.transform, material);

            int i = 0;

            foreach (var m in _subObjects)
            {
                if (String.IsNullOrEmpty(m.Value.name) || m.Value.name.IndexOf("<dyn>") == 0)
                {
                    m.Value.name = fileName + "_" + m.Value.GetType().Name + "_" + (++i);
                }
                ctx.AddSubAsset(m.Value.name, m.Value);
            }

            if (m_importMode == UsdImportMode.StripUSD)
            {
                usdStream.usdiDetachUsdComponents();
            }

            ctx.SetMainAsset(fileName, go);
        }
Ejemplo n.º 2
0
        public void AddTextures(AssetImportContext ctx, GLTFObject gltfObject)
        {
            for (int i = 0; i < gltfObject.images.Count; i++)
            {
                // Dont add asset textures
                if (gltfObject.images[i].imageIsAsset)
                {
                    continue;
                }

                Texture2D tex = gltfObject.images[i].GetTexture();
                if (tex == null)
                {
                    continue;
                }
                if (string.IsNullOrEmpty(tex.name))
                {
                    tex.name = "texture" + i.ToString();
                }
#if UNITY_2018_2_OR_NEWER
                ctx.AddObjectToAsset(i.ToString(), tex);
#else
                ctx.AddSubAsset(i.ToString(), glbObject.images[i].GetTexture());
#endif
            }
        }
Ejemplo n.º 3
0
        private void CollectSubAssets(AssetImportContext ctx, AlembicTreeNode node, Material mat)
        {
            if (m_ImportSettings.m_importMeshes)
            {
                var meshFilter = node.linkedGameObj.GetComponent <MeshFilter>();
                if (meshFilter != null)
                {
                    var m = meshFilter.sharedMesh;
                    m.name = node.linkedGameObj.name;
                    ctx.AddSubAsset(m.name, m);
                }
            }

            var renderer = node.linkedGameObj.GetComponent <MeshRenderer>();

            if (renderer != null)
            {
                renderer.material = mat;
            }

            foreach (var child in node.children)
            {
                CollectSubAssets(ctx, child, mat);
            }
        }
Ejemplo n.º 4
0
            public void Add(string identifier, Object asset)
            {
#if UNITY_2017_3_OR_NEWER
                m_ctx.AddObjectToAsset(identifier, asset);
#else
                m_ctx.AddSubAsset(identifier, asset);
#endif
            }
Ejemplo n.º 5
0
        private static void AddObjectToAsset(AssetImportContext ctx, string identifier, Object asset)
        {
#if UNITY_2017_3_OR_NEWER
            ctx.AddObjectToAsset(identifier, asset);
#else
            ctx.AddSubAsset(identifier, asset);
#endif
        }
        public static void AddAsset(this AssetImportContext ctx, string identifier, Object obj)
        {
#if UNITY_2018_2_OR_NEWER
            ctx.AddObjectToAsset(identifier, obj);
#else
            ctx.AddSubAsset(identifier, obj);
#endif
        }
Ejemplo n.º 7
0
        private void GenerateSubAssets(AssetImportContext ctx, GameObject go, AlembicStream stream)
        {
            var material = new Material(Shader.Find("Standard"))
            {
            };

            ctx.AddSubAsset("Default Material", material);

            CollectSubAssets(ctx, stream.AlembicTreeRoot, material);
        }
        public GameObject GenerateUnityObject(CameraData playable, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent)
        {
            var playableObj = MakePlayableBaseObject(playable, parent);

            var transformAnchor = new GameObject("TransformAnchor");

            playable.CurrentShotOffset.ApplyTo(transformAnchor.transform);
            transformAnchor.transform.SetParent(playableObj.transform, false);

            var cam = transformAnchor.AddComponent <Camera>();

            cam.backgroundColor = stage.backgroundColor;
            cam.clearFlags      = CameraClearFlags.SolidColor;
            // TODO: Field of view
            cam.stereoTargetEye = StereoTargetEyeMask.None;

            var pathForName = AnimationUtility.CalculateTransformPath(transformAnchor.transform, stageTransform);

            var groupTrack = parentTimeline.CreateTrack <GroupTrack>(parentTrack, playable.displayName);

            ctx.AddSubAsset(pathForName + "_GroupTrack", groupTrack);

            if (playable.Timeline.Frames.Count > 0)
            {
                var animTrack = parentTimeline.CreateTrack <AnimationTrack>(groupTrack, pathForName + "_TransformTrack");

                director.SetGenericBinding(animTrack, animator);

                ctx.AddSubAsset(pathForName + "_TransformTrack", animTrack);

                var animationClip = MakeAnimationClip(playable.Timeline, AnimationUtility.CalculateTransformPath(transformAnchor.transform, rootTransform));

                ctx.AddSubAsset(pathForName + "_animation", animationClip);

                var timelineClip = animTrack.CreateClip(animationClip);
                timelineClip.start       = (playable.AbsoluteTimeOffset + frameOffset) / stage.fps;
                timelineClip.displayName = playable.displayName;
                ctx.AddSubAsset(pathForName + "_asset", timelineClip.asset);
            }

            return(playableObj);
        }
Ejemplo n.º 9
0
        public void AddAnimations(AssetImportContext ctx, GLTFObject gltfObject)
        {
            for (int i = 0; i < gltfObject.animations.Count; i++)
            {
                AnimationClip clip = gltfObject.animations[i].Clip;
#if UNITY_2018_2_OR_NEWER
                ctx.AddObjectToAsset(clip.name, clip);
#else
                ctx.AddSubAsset(clip.name, clip);
#endif
            }
        }
Ejemplo n.º 10
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            m_ImportSettings.m_pathToAbc = new DataPath(ctx.assetPath);
            var mainObject = AlembicImportTasker.Import(m_importMode, m_ImportSettings, m_diagSettings, (stream, mainGO, streamDescr) =>
            {
                GenerateSubAssets(ctx, mainGO, stream);
                if (streamDescr != null)
                {
                    ctx.AddSubAsset(mainGO.name, streamDescr);
                }
            });

            ctx.SetMainAsset(mainObject.name, mainObject);
        }
Ejemplo n.º 11
0
        public void AddMaterials(AssetImportContext ctx, GLTFObject gltfObject)
        {
            for (int i = 0; i < gltfObject.materials.Count; i++)
            {
                Material mat = gltfObject.materials[i].GetMaterial();
                if (string.IsNullOrEmpty(mat.name))
                {
                    mat.name = "material" + i.ToString();
                }

#if UNITY_2018_2_OR_NEWER
                ctx.AddObjectToAsset(mat.name, mat);
#else
                ctx.AddSubAsset(mat.name, mat);
#endif
            }
        }
Ejemplo n.º 12
0
        public override void OnImportAsset(AssetImportContext impContext)
        {
            Attributes attributes = JsonUtility.FromJson <Attributes>(File.ReadAllText(impContext.assetPath));

            Texture2D texture = new Texture2D(attributes.width, attributes.height, attributes.tFormat, attributes.mips, true);

            texture.SetPixels(attributes.colors);
            texture.Apply();
            texture.wrapMode   = TextureWrapMode.Clamp;
            texture.filterMode = FilterMode.Point;
#if !UNITY_2017_3_OR_NEWER
            impContext.AddSubAsset("AttributesImage", texture);
            impContext.SetMainAsset("AttributesImage", texture);
#else
            impContext.AddObjectToAsset("AttributesImage", texture);
            impContext.SetMainObject(texture);
#endif
        }
Ejemplo n.º 13
0
        public void AddMeshes(AssetImportContext ctx, GLTFObject gltfObject)
        {
            for (int i = 0; i < gltfObject.meshes.Count; i++)
            {
                Mesh mesh = gltfObject.meshes[i].GetMesh();
                if (mesh == null)
                {
                    Debug.LogWarning("Mesh at index " + i + " was null");
                    continue;
                }

#if UNITY_2018_2_OR_NEWER
                ctx.AddObjectToAsset(gltfObject.meshes[i].name, gltfObject.meshes[i].GetCachedMesh());
#else
                ctx.AddSubAsset(glbObject.meshes[i].name, glbObject.meshes[i].GetCachedMesh());
#endif
            }
        }
Ejemplo n.º 14
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            stage = AnimData.LoadFromFile(ctx.assetPath);
            if (stage == null)
            {
                return;
            }

            MeshUtils.SimplifyStage(stage);

            savedClips    = new Dictionary <AudioDataPool.AudioPoolKey, AudioClip>();
            totalVertices = 0;
            totalLines    = 0;

            PreviewTexture = new Texture2D(1, 1);
            PreviewTexture.LoadImage(stage.previewFrames[0], false);
            PreviewTexture.Apply();

            if (Settings.Shader == null)
            {
                Settings.Shader = "AnimVR/Standard";
            }

            materialToUse = new Material(Shader.Find(Settings.Shader));
            materialToUse.SetFloat("_Unlit", Settings.UnlitByDefault ? 1 : 0);
            materialToUse.name = "BaseMaterial";

            ctx.AddSubAsset("BaseMaterial", materialToUse);

            needsAudioReimport = false;

            var stageObj = GenerateUnityObject(stage, ctx);

            ctx.SetMainAsset(stage.name, stageObj, PreviewTexture);

            InfoString = "FPS: " + stage.fps + ", " + stage.timelineLength + " frames \n"
                         + totalVertices + " verts, " + totalLines + " lines";

            savedClips = null;
            stage      = null;
        }
Ejemplo n.º 15
0
        public GameObject GenerateUnityObject(StageData stage, AssetImportContext ctx)
        {
            var stageObj = new GameObject(stage.name);

            stageTransform = rootTransform = stageObj.transform;

            director = stageObj.AddComponent <PlayableDirector>();
            director.extrapolationMode = Settings.DefaultWrapMode;

            var timelineAsset = TimelineAsset.CreateInstance <TimelineAsset>();

            timelineAsset.name = stage.name + "_Timeline";
            timelineAsset.editorSettings.fps = stage.fps;
            timelineAsset.durationMode       = TimelineAsset.DurationMode.FixedLength;
            timelineAsset.fixedDuration      = stage.timelineLength * 1.0 / stage.fps;

            ctx.AddSubAsset(timelineAsset.name, timelineAsset);
            director.playableAsset = timelineAsset;

            animator = stageObj.AddComponent <Animator>();

            foreach (var symbol in stage.Symbols)
            {
                var symbolObj = GenerateUnityObject(symbol, 0, ctx, timelineAsset, null, stageObj.transform);
                symbolObj.transform.SetParent(stageObj.transform, false);
                if (Settings.ApplyStageTransform)
                {
                    symbolObj.transform.localPosition += stage.transform.pos;
                    symbolObj.transform.localRotation *= stage.transform.rot;

                    var scl = symbolObj.transform.localScale;
                    var s   = stage.transform.scl;
                    symbolObj.transform.localScale = new Vector3(scl.x * s.x, scl.y * s.y, scl.z * s.z);
                }
            }

            return(stageObj);
        }
Ejemplo n.º 16
0
        public GameObject GenerateUnityObject(StaticMeshData playable, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent)
        {
            var playableObj = MakePlayableBaseObject(playable, parent);

            var transformAnchor = new GameObject("TransformAnchor");

            transformAnchor.transform.SetParent(playableObj.transform, false);
            var pathForName = AnimationUtility.CalculateTransformPath(transformAnchor.transform, stageTransform);

            List <Material> materials = new List <Material>();

            int matIndex = 0;

            foreach (var matData in playable.Materials)
            {
                var mat = MeshUtils.MaterialFromData(matData, materialToUse);
                mat.name = pathForName + "_material" + (matIndex++).ToString();
                ctx.AddSubAsset(mat.name, mat);

                if (mat.mainTexture)
                {
                    ctx.AddSubAsset(mat.name + "_diffuse", mat.mainTexture);
                }
                materials.Add(mat);
            }

            int partIndex = 0;

            foreach (var part in playable.Frames)
            {
                var partObj = new GameObject("MeshPart");
                var mf      = partObj.AddComponent <MeshFilter>();
                var mr      = partObj.AddComponent <MeshRenderer>();

                partObj.transform.SetParent(transformAnchor.transform, false);

                mr.sharedMaterial = materials[part.MaterialIndex];

                mf.sharedMesh      = MeshUtils.MeshFromData(part);
                mf.sharedMesh.name = pathForName + "_mesh" + (partIndex).ToString();
                ctx.AddSubAsset(mf.sharedMesh.name, mf.sharedMesh);

                totalVertices += mf.sharedMesh.vertexCount;
            }

            var groupTrack = parentTimeline.CreateTrack <GroupTrack>(parentTrack, playable.displayName);

            ctx.AddSubAsset(pathForName + "_GroupTrack", groupTrack);

            double clipStart    = (playable.AbsoluteTimeOffset + frameOffset) / stage.fps;
            double clipDuration = 1.0 / stage.fps;

            if (playable.InstanceMap.Count > 1)
            {
                var animTrack = parentTimeline.CreateTrack <AnimationTrack>(groupTrack, pathForName + "_TransformTrack");

                director.SetGenericBinding(animTrack, animator);

                ctx.AddSubAsset(pathForName + "_TransformTrack", animTrack);

                var animationClip = MakeAnimationClip(playable.InstanceMap, null, AnimationUtility.CalculateTransformPath(transformAnchor.transform, rootTransform));
                animationClip.name = pathForName + "_animation";


                ctx.AddSubAsset(pathForName + "_animation", animationClip);

                var timelineClip = animTrack.CreateClip(animationClip);
                timelineClip.start       = clipStart;
                timelineClip.displayName = playable.displayName;

                typeof(TimelineClip).GetProperty("preExtrapolationMode").SetValue(timelineClip, LOOP_MAPPING[playable.LoopIn], null);
                typeof(TimelineClip).GetProperty("postExtrapolationMode").SetValue(timelineClip, LOOP_MAPPING[playable.LoopOut], null);

                clipDuration = timelineClip.duration;

                ctx.AddSubAsset(pathForName + "_asset", timelineClip.asset);
            }
            else
            {
                playable.InstanceMap[0].ApplyTo(transformAnchor.transform);
            }

            var activeTrack = parentTimeline.CreateTrack <ActivationTrack>(groupTrack, pathForName + "_Activation");

            ctx.AddSubAsset(pathForName + "_Activation", activeTrack);

            director.SetGenericBinding(activeTrack, playableObj);

            var clip = activeTrack.CreateDefaultClip();

            clip.start    = playable.LoopIn != AnimVR.LoopType.OneShot ? 0 : clipStart;
            clip.duration = playable.LoopOut != AnimVR.LoopType.OneShot ? parentTimeline.fixedDuration - clip.start : (clipStart - clip.start) + clipDuration;

            ctx.AddSubAsset(pathForName + "_activeAsset", clip.asset);

            return(playableObj);
        }
        public override void OnImportAsset(AssetImportContext ctx)
        {
            {
                var ext = Path.GetExtension(ctx.assetPath).ToLower();
                if (ext == ".vox")
                {
                    fileType = VoxelBase.FileType.vox;
                }
                else if (ext == ".qb")
                {
                    fileType = VoxelBase.FileType.qb;
                }
                else
                {
                    return;
                }
            }

            #region DefaultScale
            if (dataVersion == 0 &&
                importScale == Vector3.one &&
                AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(ctx.assetPath) == null)
            {
                var x = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleX", 1f);
                var y = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleY", 1f);
                var z = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleZ", 1f);
                importScale = new Vector3(x, y, z);
            }
            #endregion

            Action <string> LogImportError = (log) =>
            {
#if UNITY_2018_1_OR_NEWER
                ctx.LogImportError(log);
#else
                Debug.LogError(log);
#endif
            };

            var gameObject  = new GameObject(Path.GetFileNameWithoutExtension(ctx.assetPath));
            var voxelObject = gameObject.AddComponent <VoxelObject>();
            {
                voxelObject.legacyVoxImport               = legacyVoxImport;
                voxelObject.importMode                    = importMode;
                voxelObject.importScale                   = importScale;
                voxelObject.importOffset                  = importOffset;
                voxelObject.combineFaces                  = combineFaces;
                voxelObject.ignoreCavity                  = ignoreCavity;
                voxelObject.voxelStructure                = outputStructure ? ScriptableObject.CreateInstance <VoxelStructure>() : null;
                voxelObject.generateLightmapUVs           = generateLightmapUVs;
                voxelObject.generateLightmapUVsAngleError = generateLightmapUVsAngleError;
                voxelObject.generateLightmapUVsAreaError  = generateLightmapUVsAreaError;
                voxelObject.generateLightmapUVsHardAngle  = generateLightmapUVsHardAngle;
                voxelObject.generateLightmapUVsPackMargin = generateLightmapUVsPackMargin;
                voxelObject.generateTangents              = generateTangents;
                voxelObject.meshFaceVertexOffset          = meshFaceVertexOffset;
                voxelObject.loadFromVoxelFile             = loadFromVoxelFile;
                voxelObject.generateMipMaps               = generateMipMaps;
            }
            var objectCore = new VoxelObjectCore(voxelObject);
            try
            {
                if (!objectCore.Create(ctx.assetPath, null))
                {
                    LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                    DestroyImmediate(gameObject);
                    return;
                }
            }
            catch
            {
                LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                DestroyImmediate(gameObject);
                return;
            }

            #region Correspondence in Issue ID 947055 Correction in case before correction is applied
            for (int i = 0; i < voxelObject.materials.Count; i++)
            {
                if (voxelObject.materials[i] != null)
                {
                    voxelObject.materials[i].hideFlags |= HideFlags.NotEditable;
                }
            }
            if (voxelObject.atlasTexture != null)
            {
                voxelObject.atlasTexture.hideFlags |= HideFlags.NotEditable;
            }
            if (voxelObject.mesh != null)
            {
                voxelObject.mesh.hideFlags |= HideFlags.NotEditable;
            }
            #endregion

            #region Material
            {
                materials     = new Material[voxelObject.materialIndexes.Count];
                materialNames = new string[voxelObject.materialIndexes.Count];
                for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                {
                    var index    = voxelObject.materialIndexes[i];
                    var material = voxelObject.materials[index];
                    material.name    = string.Format("mat{0}", index);
                    materials[i]     = material;
                    materialNames[i] = material.name;
                }
                if (remappedMaterials != null)
                {
                    remappedMaterials = remappedMaterials.Where(item => item.material != null).ToArray();
                }
            }
            #endregion

            #region Collider
            switch (colliderType)
            {
            case ColliderType.Box:
                gameObject.AddComponent <BoxCollider>();
                break;

            case ColliderType.Sphere:
                gameObject.AddComponent <SphereCollider>();
                break;

            case ColliderType.Capsule:
                gameObject.AddComponent <CapsuleCollider>();
                break;

            case ColliderType.Mesh:
                gameObject.AddComponent <MeshCollider>();
                break;
            }
            #endregion

#if UNITY_2017_3_OR_NEWER
            ctx.AddObjectToAsset(gameObject.name, gameObject);
            ctx.AddObjectToAsset(voxelObject.mesh.name = "mesh", voxelObject.mesh);
            {
                var materials = new List <Material>();
                for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                {
                    var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                    materials.Add(material);
                    if (remappedMaterials != null)
                    {
                        var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                        if (index >= 0)
                        {
                            materials[i] = remappedMaterials[index].material;
                            continue;
                        }
                    }
                    ctx.AddObjectToAsset(material.name, material);
                }
                gameObject.GetComponent <MeshRenderer>().sharedMaterials = materials.ToArray();
            }
            ctx.AddObjectToAsset(voxelObject.atlasTexture.name = "tex", voxelObject.atlasTexture);
            if (voxelObject.voxelStructure != null)
            {
                ctx.AddObjectToAsset(voxelObject.voxelStructure.name = "structure", voxelObject.voxelStructure);
            }

            VoxelObject.DestroyImmediate(voxelObject);

            ctx.SetMainObject(gameObject);
#else
            ctx.SetMainAsset(gameObject.name, gameObject);
            ctx.AddSubAsset(voxelObject.mesh.name = "mesh", voxelObject.mesh);
            for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
            {
                var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                ctx.AddSubAsset(material.name, material);
            }
            ctx.AddSubAsset(voxelObject.atlasTexture.name = "tex", voxelObject.atlasTexture);
            if (voxelObject.voxelStructure != null)
            {
                ctx.AddSubAsset(voxelObject.voxelStructure.name = "structure", voxelObject.voxelStructure);
            }

            VoxelObject.DestroyImmediate(voxelObject);
#endif
            dataVersion = EditorDataVersion;
        }
Ejemplo n.º 18
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            {
                var ext = Path.GetExtension(ctx.assetPath).ToLower();
                if (ext == ".vox")
                {
                    fileType = VoxelBase.FileType.vox;
                }
                else if (ext == ".qb")
                {
                    fileType = VoxelBase.FileType.qb;
                }
                else
                {
                    return;
                }
            }

            #region DefaultScale
            if (dataVersion == 0 &&
                importScale == Vector3.one &&
                AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(ctx.assetPath) == null)
            {
                var x = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleX", 1f);
                var y = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleY", 1f);
                var z = EditorPrefs.GetFloat("VoxelImporter_DefaultScaleZ", 1f);
                importScale = new Vector3(x, y, z);
            }
            #endregion

            #region LegacyAssetNaming
            if (dataVersion > 0 && dataVersion < 6)
            {
                legacyAssetNaming = true;
            }
            #endregion

            Action <string> LogImportError = (log) =>
            {
#if UNITY_2018_1_OR_NEWER
                ctx.LogImportError(log);
#else
                Debug.LogError(log);
#endif
            };
            Action <VoxelBase> SetBasicOptions = (voxelObject) =>
            {
                voxelObject.importMode                    = importMode;
                voxelObject.importScale                   = importScale;
                voxelObject.importOffset                  = importOffset;
                voxelObject.combineFaces                  = combineFaces;
                voxelObject.ignoreCavity                  = ignoreCavity;
                voxelObject.shareSameFace                 = shareSameFace;
                voxelObject.removeUnusedPalettes          = removeUnusedPalettes;
                voxelObject.voxelStructure                = outputStructure ? ScriptableObject.CreateInstance <VoxelStructure>() : null;
                voxelObject.generateLightmapUVs           = generateLightmapUVs;
                voxelObject.generateLightmapUVsAngleError = generateLightmapUVsAngleError;
                voxelObject.generateLightmapUVsAreaError  = generateLightmapUVsAreaError;
                voxelObject.generateLightmapUVsHardAngle  = generateLightmapUVsHardAngle;
                voxelObject.generateLightmapUVsPackMargin = generateLightmapUVsPackMargin;
                voxelObject.generateTangents              = generateTangents;
                voxelObject.meshFaceVertexOffset          = meshFaceVertexOffset;
                voxelObject.loadFromVoxelFile             = loadFromVoxelFile;
                voxelObject.generateMipMaps               = generateMipMaps;
                voxelObject.legacyVoxImport               = legacyVoxImport;
                voxelObject.legacyAssetNaming             = legacyAssetNaming;
            };

            Action <VoxelBaseCore> Export = (core) =>
            {
                if (export)
                {
                    var fullPath = Application.dataPath + ctx.assetPath.Remove(0, "Assets".Length);
                    fullPath = fullPath.Remove(fullPath.LastIndexOf('.')) + ".dae";
                    core.ExportDaeFile(fullPath, false);
                }
            };

            var gameObject = new GameObject(Path.GetFileNameWithoutExtension(ctx.assetPath));
            if (string.IsNullOrEmpty(gameObjectName))
            {
                gameObjectName = gameObject.name;
            }
            if (meshMode == MeshMode.Combine)
            {
                #region Combine
                var voxelObject = gameObject.AddComponent <VoxelObject>();
                SetBasicOptions(voxelObject);
                var objectCore = new VoxelObjectCore(voxelObject);
                try
                {
                    if (!objectCore.Create(ctx.assetPath, null))
                    {
                        LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                        DestroyImmediate(gameObject);
                        return;
                    }
                }
                catch
                {
                    LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                    DestroyImmediate(gameObject);
                    return;
                }

                #region Correspondence in Issue ID 947055 Correction in case before correction is applied
                foreach (var material in voxelObject.materials)
                {
                    if (material != null)
                    {
                        material.hideFlags |= HideFlags.NotEditable;
                    }
                }
                if (voxelObject.atlasTexture != null)
                {
                    voxelObject.atlasTexture.hideFlags |= HideFlags.NotEditable;
                }
                if (voxelObject.mesh != null)
                {
                    voxelObject.mesh.hideFlags |= HideFlags.NotEditable;
                }
                #endregion

                #region Material
                {
                    materials     = new Material[voxelObject.materialIndexes.Count];
                    materialNames = new string[voxelObject.materialIndexes.Count];
                    for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                    {
                        var index    = voxelObject.materialIndexes[i];
                        var material = voxelObject.materials[index];
                        materials[i]     = material;
                        materialNames[i] = material.name;
                    }
                    if (remappedMaterials != null)
                    {
                        remappedMaterials = remappedMaterials.Where(item => item.material != null && materialNames.Contains(item.name)).ToArray();
                    }
                }
                #endregion

                #region Structure
                if (voxelObject.voxelStructure != null)
                {
                    if (legacyAssetNaming)
                    {
                        voxelObject.voxelStructure.name = "structure";
                    }
                    else
                    {
                        voxelObject.voxelStructure.name = Path.GetFileNameWithoutExtension(ctx.assetPath);
                    }
                }
                #endregion

                #region Collider
                switch (colliderType)
                {
                case ColliderType.Box:
                    gameObject.AddComponent <BoxCollider>();
                    break;

                case ColliderType.Sphere:
                    gameObject.AddComponent <SphereCollider>();
                    break;

                case ColliderType.Capsule:
                    gameObject.AddComponent <CapsuleCollider>();
                    break;

                case ColliderType.Mesh:
                    gameObject.AddComponent <MeshCollider>();
                    break;
                }
                #endregion

                Export(objectCore);

#if UNITY_2017_3_OR_NEWER
                ctx.AddObjectToAsset(gameObjectName, gameObject);
                ctx.AddObjectToAsset("mesh", voxelObject.mesh);
                {
                    var list = new List <Material>();
                    for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                    {
                        var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                        list.Add(material);
                        if (remappedMaterials != null)
                        {
                            var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                            if (index >= 0)
                            {
                                list[i] = remappedMaterials[index].material;
                                continue;
                            }
                        }
                        ctx.AddObjectToAsset(string.Format("mat{0}", i), material);
                    }
                    gameObject.GetComponent <MeshRenderer>().sharedMaterials = list.ToArray();
                }
                ctx.AddObjectToAsset("tex", voxelObject.atlasTexture);
                if (voxelObject.voxelStructure != null)
                {
                    ctx.AddObjectToAsset("structure", voxelObject.voxelStructure);
                }

                VoxelObject.DestroyImmediate(voxelObject);

                ctx.SetMainObject(gameObject);
#else
                ctx.SetMainAsset(gameObjectName, gameObject);
                ctx.AddSubAsset("mesh", voxelObject.mesh);
                for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                {
                    var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                    ctx.AddSubAsset(string.Format("mat{0}", i), material);
                }
                ctx.AddSubAsset("tex", voxelObject.atlasTexture);
                if (voxelObject.voxelStructure != null)
                {
                    ctx.AddSubAsset("structure", voxelObject.voxelStructure);
                }

                VoxelObject.DestroyImmediate(voxelObject);
#endif
                #endregion
            }
            else if (meshMode == MeshMode.Individual)
            {
                #region Individual
                var voxelObject = gameObject.AddComponent <VoxelChunksObject>();
                SetBasicOptions(voxelObject);
                {
                    voxelObject.createContactChunkFaces = createContactChunkFaces;
                    voxelObject.materialMode            = materialMode;
                }
                var objectCore = new VoxelChunksObjectCore(voxelObject);
                try
                {
                    if (!objectCore.Create(ctx.assetPath, null))
                    {
                        LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                        DestroyImmediate(gameObject);
                        return;
                    }
                }
                catch
                {
                    LogImportError(string.Format("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath));
                    DestroyImmediate(gameObject);
                    return;
                }

                #region Correspondence in Issue ID 947055 Correction in case before correction is applied
                if (voxelObject.materials != null)
                {
                    foreach (var material in voxelObject.materials)
                    {
                        if (material != null)
                        {
                            material.hideFlags |= HideFlags.NotEditable;
                        }
                    }
                }
                if (voxelObject.atlasTexture != null)
                {
                    voxelObject.atlasTexture.hideFlags |= HideFlags.NotEditable;
                }
                foreach (var chunk in voxelObject.chunks)
                {
                    if (chunk.materials != null)
                    {
                        foreach (var material in chunk.materials)
                        {
                            if (material != null)
                            {
                                material.hideFlags |= HideFlags.NotEditable;
                            }
                        }
                    }
                    if (chunk.atlasTexture != null)
                    {
                        chunk.atlasTexture.hideFlags |= HideFlags.NotEditable;
                    }
                    if (chunk.mesh != null)
                    {
                        chunk.mesh.hideFlags |= HideFlags.NotEditable;
                    }
                }
                #endregion

                #region Legacy
                if (legacyAssetNaming)
                {
                    foreach (var chunk in voxelObject.chunks)
                    {
                        var oldName = chunk.chunkName;
                        chunk.chunkName       = chunk.chunkName.Replace("Chunk(", "");
                        chunk.chunkName       = chunk.chunkName.Remove(chunk.chunkName.Length - 1, 1);
                        chunk.gameObject.name = chunk.chunkName;
                        chunk.mesh.name       = chunk.mesh.name.Replace(oldName, chunk.chunkName);
                        if (chunk.materials != null)
                        {
                            foreach (var mat in chunk.materials)
                            {
                                if (mat == null)
                                {
                                    continue;
                                }
                                mat.name = mat.name.Replace(oldName, chunk.chunkName);
                            }
                        }
                        if (chunk.atlasTexture != null)
                        {
                            chunk.atlasTexture.name = chunk.atlasTexture.name.Replace(oldName, chunk.chunkName);
                        }
                    }
                }
                #endregion

                #region Material
                {
                    if (materialMode == VoxelChunksObject.MaterialMode.Combine)
                    {
                        materials     = new Material[voxelObject.materialIndexes.Count];
                        materialNames = new string[voxelObject.materialIndexes.Count];
                        for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                        {
                            var index    = voxelObject.materialIndexes[i];
                            var material = voxelObject.materials[index];
                            materials[i]     = material;
                            materialNames[i] = material.name;
                        }
                    }
                    else if (materialMode == VoxelChunksObject.MaterialMode.Individual)
                    {
                        List <Material> list = new List <Material>();
                        foreach (var chunk in voxelObject.chunks)
                        {
                            for (int i = 0; i < chunk.materialIndexes.Count; i++)
                            {
                                var index    = chunk.materialIndexes[i];
                                var material = chunk.materials[index];
                                if (!list.Contains(material))
                                {
                                    list.Add(material);
                                }
                            }
                        }
                        materials     = list.ToArray();
                        materialNames = new string[list.Count];
                        for (int i = 0; i < list.Count; i++)
                        {
                            materialNames[i] = list[i].name;
                        }
                    }
                    if (remappedMaterials != null)
                    {
                        remappedMaterials = remappedMaterials.Where(item => item.material != null && materialNames.Contains(item.name)).ToArray();
                    }
                }
                #endregion

                #region Structure
                if (voxelObject.voxelStructure != null)
                {
                    if (legacyAssetNaming)
                    {
                        voxelObject.voxelStructure.name = "structure";
                    }
                    else
                    {
                        voxelObject.voxelStructure.name = Path.GetFileNameWithoutExtension(ctx.assetPath);
                    }
                }
                #endregion

                #region Collider
                foreach (var chunk in voxelObject.chunks)
                {
                    switch (colliderType)
                    {
                    case ColliderType.Box:
                        chunk.gameObject.AddComponent <BoxCollider>();
                        break;

                    case ColliderType.Sphere:
                        chunk.gameObject.AddComponent <SphereCollider>();
                        break;

                    case ColliderType.Capsule:
                        chunk.gameObject.AddComponent <CapsuleCollider>();
                        break;

                    case ColliderType.Mesh:
                        chunk.gameObject.AddComponent <MeshCollider>();
                        break;
                    }
                }
                #endregion

                Export(objectCore);

#if UNITY_2017_3_OR_NEWER
                ctx.AddObjectToAsset(gameObjectName, gameObject);
                foreach (var chunk in voxelObject.chunks)
                {
                    ctx.AddObjectToAsset(chunk.chunkName + "_mesh", chunk.mesh);
                }
                {
                    if (materialMode == VoxelChunksObject.MaterialMode.Combine)
                    {
                        var materials = new List <Material>();
                        for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                        {
                            var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                            materials.Add(material);
                            if (remappedMaterials != null)
                            {
                                var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                                if (index >= 0)
                                {
                                    materials[i] = remappedMaterials[index].material;
                                    continue;
                                }
                            }
                            ctx.AddObjectToAsset(string.Format("mat{0}", i), material);
                        }
                        foreach (var chunk in voxelObject.chunks)
                        {
                            chunk.gameObject.GetComponent <MeshRenderer>().sharedMaterials = materials.ToArray();
                        }
                        ctx.AddObjectToAsset("tex", voxelObject.atlasTexture);
                    }
                    else if (materialMode == VoxelChunksObject.MaterialMode.Individual)
                    {
                        foreach (var chunk in voxelObject.chunks)
                        {
                            var materials = new List <Material>();
                            for (int i = 0; i < chunk.materialIndexes.Count; i++)
                            {
                                var material = chunk.materials[chunk.materialIndexes[i]];
                                materials.Add(material);
                                if (remappedMaterials != null)
                                {
                                    var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                                    if (index >= 0)
                                    {
                                        materials[i] = remappedMaterials[index].material;
                                        continue;
                                    }
                                }
                                ctx.AddObjectToAsset(chunk.gameObject.name + string.Format("_mat{0}", i), material);
                            }
                            chunk.gameObject.GetComponent <MeshRenderer>().sharedMaterials = materials.ToArray();
                            ctx.AddObjectToAsset(chunk.gameObject.name + "_tex", chunk.atlasTexture);
                        }
                    }
                }
                if (voxelObject.voxelStructure != null)
                {
                    ctx.AddObjectToAsset("structure", voxelObject.voxelStructure);
                }

                foreach (var chunk in voxelObject.chunks)
                {
                    VoxelChunksObjectChunk.DestroyImmediate(chunk.GetComponent <VoxelChunksObjectChunk>());
                }
                VoxelObject.DestroyImmediate(voxelObject);

                ctx.SetMainObject(gameObject);
#else
                ctx.SetMainAsset(gameObjectName, gameObject);
                foreach (var chunk in voxelObject.chunks)
                {
                    ctx.AddSubAsset(chunk.gameObject.name + "_mesh", chunk.mesh);
                }
                {
                    if (materialMode == VoxelChunksObject.MaterialMode.Combine)
                    {
                        var materials = new List <Material>();
                        for (int i = 0; i < voxelObject.materialIndexes.Count; i++)
                        {
                            var material = voxelObject.materials[voxelObject.materialIndexes[i]];
                            materials.Add(material);
                            if (remappedMaterials != null)
                            {
                                var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                                if (index >= 0)
                                {
                                    materials[i] = remappedMaterials[index].material;
                                    continue;
                                }
                            }
                            ctx.AddSubAsset(string.Format("mat{0}", i), material, material);
                        }
                        foreach (var chunk in voxelObject.chunks)
                        {
                            chunk.gameObject.GetComponent <MeshRenderer>().sharedMaterials = materials.ToArray();
                        }
                        ctx.AddSubAsset("tex", voxelObject.atlasTexture);
                    }
                    else if (materialMode == VoxelChunksObject.MaterialMode.Individual)
                    {
                        foreach (var chunk in voxelObject.chunks)
                        {
                            var materials = new List <Material>();
                            for (int i = 0; i < chunk.materialIndexes.Count; i++)
                            {
                                var material = chunk.materials[chunk.materialIndexes[i]];
                                materials.Add(material);
                                if (remappedMaterials != null)
                                {
                                    var index = ArrayUtility.FindIndex(remappedMaterials, (t) => { return(t.name == material.name); });
                                    if (index >= 0)
                                    {
                                        materials[i] = remappedMaterials[index].material;
                                        continue;
                                    }
                                }
                                ctx.AddSubAsset(chunk.gameObject.name + string.Format("_mat{0}", i), material);
                            }
                            chunk.gameObject.GetComponent <MeshRenderer>().sharedMaterials = materials.ToArray();
                            ctx.AddSubAsset(chunk.gameObject.name + "_tex", chunk.atlasTexture);
                        }
                    }
                }
                if (voxelObject.voxelStructure != null)
                {
                    ctx.AddSubAsset("structure", voxelObject.voxelStructure);
                }

                foreach (var chunk in voxelObject.chunks)
                {
                    VoxelChunksObjectChunk.DestroyImmediate(chunk.GetComponent <VoxelChunksObjectChunk>());
                }
                VoxelObject.DestroyImmediate(voxelObject);
#endif
                #endregion
            }

            dataVersion = EditorDataVersion;
        }
Ejemplo n.º 19
0
        public GameObject GenerateUnityObject(SymbolData symbol, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent)
        {
            var symbolObj = MakePlayableBaseObject(symbol, parent);

            var path = AnimationUtility.CalculateTransformPath(symbolObj.transform, stageTransform);

            var prevDirector      = director;
            var prevRootTransform = rootTransform;
            var prevAnimator      = animator;


            // Top level symbol doesn't need to group stuff
            if (parent != stageTransform)
            {
                int minPlayableStart = symbol.Playables.Min(p => p.AbsoluteTimeOffset);
                int frameLength      = symbol.Playables.Max(p => p.AbsoluteTimeOffset + p.GetFrameCount(stage.fps) - minPlayableStart);

                int frameStart = symbol.AbsoluteTimeOffset + minPlayableStart;

                director = symbolObj.AddComponent <PlayableDirector>();
                var timelineAsset = TimelineAsset.CreateInstance <TimelineAsset>();
                timelineAsset.name = path + "_Timeline";
                timelineAsset.editorSettings.fps = stage.fps;
                timelineAsset.durationMode       = TimelineAsset.DurationMode.BasedOnClips;
                timelineAsset.fixedDuration      = frameLength / stage.fps;

                ctx.AddSubAsset(timelineAsset.name, timelineAsset);
                director.playableAsset = timelineAsset;

                animator = symbolObj.AddComponent <Animator>();

                var controlTrack = parentTimeline.CreateTrack <AnimVR.Timeline.AnimControlTrack>(null, symbolObj.name);
                ctx.AddSubAsset(path + "_Control", controlTrack);

                var controlClip = controlTrack.CreateDefaultClip();
                controlClip.displayName = symbolObj.name;
                controlClip.start       = frameStart / stage.fps;
                controlClip.duration    = frameLength / stage.fps;

                typeof(TimelineClip).GetProperty("preExtrapolationMode").SetValue(controlClip, LOOP_MAPPING[symbol.LoopIn], null);
                typeof(TimelineClip).GetProperty("postExtrapolationMode").SetValue(controlClip, LOOP_MAPPING[symbol.LoopOut], null);

                var controlAsset = controlClip.asset as AnimVR.Timeline.AnimControlPlayableAsset;
                controlAsset.name = symbolObj.name;
                prevDirector.SetGenericBinding(controlAsset, symbolObj);

                ctx.AddSubAsset(path + "_ControlAsset", controlAsset);

                parentTimeline = timelineAsset;
                rootTransform  = symbolObj.transform;

                frameOffset = -minPlayableStart;
            }

            foreach (var playbale in symbol.Playables)
            {
                if (playbale.isVisible)
                {
                    GenerateUnityObject(playbale, frameOffset, ctx, parentTimeline, null, symbolObj.transform);
                }
            }

            director      = prevDirector;
            rootTransform = prevRootTransform;
            animator      = prevAnimator;

            return(symbolObj);
        }
Ejemplo n.º 20
0
        public GameObject GenerateUnityObject(TimeLineData playable, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent)
        {
            var playableObj = MakePlayableBaseObject(playable, parent);
            var pathForName = AnimationUtility.CalculateTransformPath(playableObj.transform, stageTransform);

            // GROUP
            var groupTrack = parentTimeline.CreateTrack <GroupTrack>(parentTrack, playable.displayName);

            ctx.AddSubAsset(pathForName + "_GroupTrack", groupTrack);

            // ANIMATION
            var animationTrack = parentTimeline.CreateTrack <AnimVRTrack>(groupTrack, pathForName + "_animation");

            ctx.AddSubAsset(pathForName + "_animation", animationTrack);

            var animationClip = animationTrack.CreateDefaultClip();

            animationClip.duration = playable.GetFrameCount(stage.fps) / stage.fps;
            animationClip.start    = (playable.AbsoluteTimeOffset + frameOffset) / stage.fps;

            typeof(TimelineClip).GetProperty("preExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopIn], null);
            typeof(TimelineClip).GetProperty("postExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopOut], null);

            var animAsset = animationClip.asset as AnimVRFramesAsset;

            animAsset.FPS = stage.fps;

            director.SetGenericBinding(animAsset, playableObj);
            ctx.AddSubAsset(pathForName + "_activeAsset", animAsset);

            // ACTIVATION
            var frameTrack = parentTimeline.CreateTrack <ActivationTrack>(groupTrack, pathForName + "_track");

            ctx.AddSubAsset(pathForName + "_track", frameTrack);
            director.SetGenericBinding(frameTrack, playableObj);

            var frameClip = frameTrack.CreateDefaultClip();

            frameClip.start    = playable.LoopIn != AnimVR.LoopType.OneShot ? 0 : animationClip.start;
            frameClip.duration = playable.LoopOut != AnimVR.LoopType.OneShot ?
                                 parentTimeline.fixedDuration - frameClip.start :
                                 (animationClip.start - frameClip.start) + animationClip.duration;

            ctx.AddSubAsset(pathForName + "_activeAsset", frameClip.asset);

            int frameIndex = -1;

            foreach (var frame in playable.Frames)
            {
                if (!frame.isInstance)
                {
                    var frameObj = GenerateUnityObject(frame, ctx, parentTimeline, playableObj.transform, ++frameIndex);
                    if (frameIndex != 0)
                    {
                        frameObj.SetActive(false);
                    }
                    frameObj.transform.SetAsLastSibling();
                }
                animAsset.FrameIndices.Add(frameIndex);
            }

            return(playableObj);
        }
Ejemplo n.º 21
0
        public GameObject GenerateUnityObject(FrameData frame, AssetImportContext ctx, TimelineAsset parentTimeline, Transform parent, int index)
        {
            var playableObj = new GameObject(index.ToString());

            playableObj.transform.parent        = parent;
            playableObj.transform.localPosition = frame.transform.pos.V3;
            playableObj.transform.localRotation = frame.transform.rot.Q;
            playableObj.transform.localScale    = frame.transform.scl.V3;

            var pathForName = AnimationUtility.CalculateTransformPath(playableObj.transform, stageTransform);


            List <List <CombineInstance> > instances   = new List <List <CombineInstance> >();
            List <CombineInstance>         currentList = new List <CombineInstance>();

            instances.Add(currentList);
            int vCount = 0;

            foreach (var line in frame.Lines)
            {
                try
                {
                    List <Vector3> verts   = new List <Vector3>();
                    List <int>     indices = new List <int>();
                    List <Vector4> colors  = new List <Vector4>();

                    MeshUtils.GeneratePositionData(line, verts, indices, colors);

                    CombineInstance instance = new CombineInstance();

                    if (verts.Count == 0)
                    {
                        continue;
                    }

                    Mesh mesh = new Mesh();
                    mesh.SetVertices(verts);
                    mesh.SetTriangles(indices, 0);
                    mesh.SetColors(colors.Select(c => new Color(c.x, c.y, c.z, c.w)).ToList());
                    instance.mesh = mesh;

                    vCount += verts.Count;

                    if (vCount > 60000)
                    {
                        currentList = new List <CombineInstance>();
                        instances.Add(currentList);
                        vCount -= 60000;
                    }

                    currentList.Add(instance);
                    totalLines++;
                }
                catch (Exception e)
                {
                    Debug.LogWarning(e.Message);
                }
            }

            totalVertices += vCount;

            int meshId = 0;

            foreach (var mesh in instances)
            {
                var subObj = new GameObject("Submesh" + index);
                subObj.transform.SetParent(playableObj.transform, false);

                var  mf           = subObj.AddComponent <MeshFilter>();
                var  mr           = subObj.AddComponent <MeshRenderer>();
                Mesh combinedMesh = new Mesh();

                combinedMesh.CombineMeshes(mesh.ToArray(), true, false, false);
                combinedMesh.name = pathForName + meshId;

                mf.sharedMesh     = combinedMesh;
                mr.sharedMaterial = materialToUse;

                ctx.AddSubAsset(pathForName + "_mesh" + index, mf.sharedMesh);
                meshId++;
            }


            return(playableObj);
        }
Ejemplo n.º 22
0
 public static void AddObjectToAsset(this AssetImportContext ctx, string key, Object o)
 {
     ctx.AddSubAsset(key, o);
 }
Ejemplo n.º 23
0
        public GameObject GenerateUnityObject(AudioData playable, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent)
        {
            AudioClip clip = null;

            var dir      = Application.dataPath + Path.GetDirectoryName(ctx.assetPath).Substring(6);
            var clipPath = dir + "/" + Path.GetFileNameWithoutExtension(ctx.assetPath) + "_audio/" + playable.displayName + "_audio.wav";

            if (savedClips.ContainsKey(playable.audioDataKey))
            {
                clip = savedClips[playable.audioDataKey];
            }
            else
            {
                var assetPath = clipPath.Replace(Application.dataPath, "Assets");

                if (!File.Exists(clipPath))
                {
                    clip = stage.AudioDataPool.RetrieveClipFromPool(playable.audioDataKey);
                    if (clip)
                    {
                        clip.name = playable.displayName + "_audio";
                        SavWav.Save(clipPath, clip);
                        AssetDatabase.ImportAsset(assetPath);
                        if (Settings.AudioImport != AudioImportSetting.ClipsAndTracks)
                        {
                            needsAudioReimport = true;
                        }
                    }
                }

                clip = AssetDatabase.LoadAssetAtPath <AudioClip>(assetPath);
                savedClips[playable.audioDataKey] = clip;
            }

            if (Settings.AudioImport != AudioImportSetting.ClipsAndTracks)
            {
                return(null);
            }

            var playableObj = MakePlayableBaseObject(playable, parent);
            var audioSource = playableObj.AddComponent <AudioSource>();

            audioSource.spatialBlend = playable.Spatialize ? 0 : 1;

            var pathForName = AnimationUtility.CalculateTransformPath(playableObj.transform, stageTransform);

            var groupTrack = parentTimeline.CreateTrack <GroupTrack>(parentTrack, playable.displayName);

            ctx.AddSubAsset(pathForName + "_GroupTrack", groupTrack);

            var track = parentTimeline.CreateTrack <AudioTrack>(groupTrack, playable.displayName);

            ctx.AddSubAsset(pathForName + "_audioTrack", track);

            bool loop = playable.LoopType == AnimVR.LoopType.Loop;

            var audioTrackClip = track.CreateDefaultClip();

            audioTrackClip.displayName = playable.displayName;
            (audioTrackClip.asset as AudioPlayableAsset).clip = clip;

            typeof(AudioPlayableAsset).GetField("m_Loop",
                                                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).
            SetValue(audioTrackClip.asset, loop);

            float start    = (playable.AbsoluteTimeOffset + frameOffset) / stage.fps;
            float duration = clip ? clip.length : 1;

            if (loop)
            {
                audioTrackClip.start    = 0;
                audioTrackClip.duration = parentTimeline.fixedDuration;
                audioTrackClip.clipIn   = duration - start % duration;
            }
            else
            {
                audioTrackClip.start    = start;
                audioTrackClip.duration = duration;
            }

            ctx.AddSubAsset(pathForName + "_asset", audioTrackClip.asset);

            director.SetGenericBinding(track, audioSource);

            return(playableObj);
        }
Ejemplo n.º 24
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            string     sceneName = null;
            GameObject gltfScene = null;

            UnityEngine.Mesh[] meshes = null;
            try
            {
                sceneName = Path.GetFileNameWithoutExtension(ctx.assetPath);
                gltfScene = CreateGLTFScene(ctx.assetPath);

                // Remove empty roots
                if (_removeEmptyRootObjects)
                {
                    var t = gltfScene.transform;
                    while (
                        gltfScene.transform.childCount == 1 &&
                        gltfScene.GetComponents <Component>().Length == 1)
                    {
                        var parent = gltfScene;
                        gltfScene = gltfScene.transform.GetChild(0).gameObject;
                        t         = gltfScene.transform;
                        t.parent  = null;                // To keep transform information in the new parent
                        Object.DestroyImmediate(parent); // Get rid of the parent
                    }
                }

                // Ensure there are no hide flags present (will cause problems when saving)
                gltfScene.hideFlags &= ~(HideFlags.HideAndDontSave);
                foreach (Transform child in gltfScene.transform)
                {
                    child.gameObject.hideFlags &= ~(HideFlags.HideAndDontSave);
                }

                // Zero position
                gltfScene.transform.position = Vector3.zero;

                // Get meshes
                var meshNames    = new List <string>();
                var meshHash     = new HashSet <UnityEngine.Mesh>();
                var meshFilters  = gltfScene.GetComponentsInChildren <MeshFilter>();
                var vertexBuffer = new List <Vector3>();
                meshes = meshFilters.Select(mf =>
                {
                    var mesh = mf.sharedMesh;
                    vertexBuffer.Clear();
                    mesh.GetVertices(vertexBuffer);
                    for (var i = 0; i < vertexBuffer.Count; ++i)
                    {
                        vertexBuffer[i] *= _scaleFactor;
                    }
                    mesh.SetVertices(vertexBuffer);
                    if (_swapUvs)
                    {
                        var uv   = mesh.uv;
                        var uv2  = mesh.uv2;
                        mesh.uv  = uv2;
                        mesh.uv2 = uv2;
                    }
                    if (_importNormals == GLTFImporterNormals.None)
                    {
                        mesh.normals = new Vector3[0];
                    }
                    if (_importNormals == GLTFImporterNormals.Calculate)
                    {
                        mesh.RecalculateNormals();
                    }
                    mesh.UploadMeshData(!_readWriteEnabled);

                    if (_generateColliders)
                    {
                        var collider        = mf.gameObject.AddComponent <MeshCollider>();
                        collider.sharedMesh = mesh;
                    }

                    if (meshHash.Add(mesh))
                    {
                        var meshName = string.IsNullOrEmpty(mesh.name) ? mf.gameObject.name : mesh.name;
                        mesh.name    = ObjectNames.GetUniqueName(meshNames.ToArray(), meshName);
                        meshNames.Add(mesh.name);
                    }

                    return(mesh);
                }).ToArray();

                var renderers = gltfScene.GetComponentsInChildren <Renderer>();

                if (_importMaterials)
                {
                    // Get materials
                    var materialNames = new List <string>();
                    var materialHash  = new HashSet <UnityEngine.Material>();
                    var materials     = renderers.SelectMany(r =>
                    {
                        return(r.sharedMaterials.Select(mat =>
                        {
                            if (materialHash.Add(mat))
                            {
                                var matName = string.IsNullOrEmpty(mat.name) ? mat.shader.name : mat.name;
                                if (matName == mat.shader.name)
                                {
                                    matName = matName.Substring(Mathf.Min(matName.LastIndexOf("/") + 1, matName.Length - 1));
                                }

                                // Ensure name is unique
                                matName = string.Format("{0} {1}", sceneName, ObjectNames.NicifyVariableName(matName));
                                matName = ObjectNames.GetUniqueName(materialNames.ToArray(), matName);

                                mat.name = matName;
                                materialNames.Add(matName);
                            }

                            return mat;
                        }));
                    }).ToArray();

                    // Get textures
                    var textureNames   = new List <string>();
                    var textureHash    = new HashSet <Texture2D>();
                    var texMaterialMap = new Dictionary <Texture2D, List <TexMaterialMap> >();
                    var textures       = materials.SelectMany(mat =>
                    {
                        var shader = mat.shader;
                        if (!shader)
                        {
                            return(Enumerable.Empty <Texture2D>());
                        }

                        var matTextures = new List <Texture2D>();
                        for (var i = 0; i < ShaderUtil.GetPropertyCount(shader); ++i)
                        {
                            if (ShaderUtil.GetPropertyType(shader, i) == ShaderUtil.ShaderPropertyType.TexEnv)
                            {
                                var propertyName = ShaderUtil.GetPropertyName(shader, i);
                                var tex          = mat.GetTexture(propertyName) as Texture2D;
                                if (tex)
                                {
                                    if (textureHash.Add(tex))
                                    {
                                        var texName = tex.name;
                                        if (string.IsNullOrEmpty(texName))
                                        {
                                            if (propertyName.StartsWith("_"))
                                            {
                                                texName = propertyName.Substring(Mathf.Min(1, propertyName.Length - 1));
                                            }
                                        }

                                        // Ensure name is unique
                                        texName = string.Format("{0} {1}", sceneName, ObjectNames.NicifyVariableName(texName));
                                        texName = ObjectNames.GetUniqueName(textureNames.ToArray(), texName);

                                        tex.name = texName;
                                        textureNames.Add(texName);
                                        matTextures.Add(tex);
                                    }

                                    List <TexMaterialMap> materialMaps;
                                    if (!texMaterialMap.TryGetValue(tex, out materialMaps))
                                    {
                                        materialMaps = new List <TexMaterialMap>();
                                        texMaterialMap.Add(tex, materialMaps);
                                    }

                                    materialMaps.Add(new TexMaterialMap(mat, propertyName, propertyName == "_BumpMap"));
                                }
                            }
                        }
                        return(matTextures);
                    }).ToArray();

                    var folderName = Path.GetDirectoryName(ctx.assetPath);

                    // Save textures as separate assets and rewrite refs
                    // TODO: Support for other texture types
                    if (textures.Length > 0)
                    {
                        var texturesRoot = string.Concat(folderName, "/", "Textures/");
                        Directory.CreateDirectory(texturesRoot);

                        foreach (var tex in textures)
                        {
                            var ext     = _useJpgTextures ? ".jpg" : ".png";
                            var texPath = string.Concat(texturesRoot, tex.name, ext);
                            File.WriteAllBytes(texPath, _useJpgTextures ? tex.EncodeToJPG() : tex.EncodeToPNG());

                            AssetDatabase.ImportAsset(texPath);
                        }
                    }

                    // Save materials as separate assets and rewrite refs
                    if (materials.Length > 0)
                    {
                        var materialRoot = string.Concat(folderName, "/", "Materials/");
                        Directory.CreateDirectory(materialRoot);

                        foreach (var mat in materials)
                        {
                            var materialPath = string.Concat(materialRoot, mat.name, ".mat");
                            var newMat       = mat;
                            CopyOrNew(mat, materialPath, m =>
                            {
                                // Fix references
                                newMat = m;
                                foreach (var r in renderers)
                                {
                                    var sharedMaterials = r.sharedMaterials;
                                    for (var i = 0; i < sharedMaterials.Length; ++i)
                                    {
                                        var sharedMaterial = sharedMaterials[i];
                                        if (sharedMaterial.name == mat.name)
                                        {
                                            sharedMaterials[i] = m;
                                        }
                                    }
                                    sharedMaterials   = sharedMaterials.Where(sm => sm).ToArray();
                                    r.sharedMaterials = sharedMaterials;
                                }
                            });
                            // Fix textures
                            // HACK: This needs to be a delayed call.
                            // Unity needs a frame to kick off the texture import so we can rewrite the ref
                            if (textures.Length > 0)
                            {
                                EditorApplication.delayCall += () =>
                                {
                                    for (var i = 0; i < textures.Length; ++i)
                                    {
                                        var tex          = textures[i];
                                        var texturesRoot = string.Concat(folderName, "/", "Textures/");
                                        var ext          = _useJpgTextures ? ".jpg" : ".png";
                                        var texPath      = string.Concat(texturesRoot, tex.name, ext);

                                        // Grab new imported texture
                                        var materialMaps = texMaterialMap[tex];
                                        var importer     = (TextureImporter)TextureImporter.GetAtPath(texPath);
                                        var importedTex  = AssetDatabase.LoadAssetAtPath <Texture2D>(texPath);
                                        if (importer != null)
                                        {
                                            var isNormalMap = false;
                                            foreach (var materialMap in materialMaps)
                                            {
                                                if (materialMap.Material == mat)
                                                {
                                                    isNormalMap |= materialMap.IsNormalMap;
                                                    newMat.SetTexture(materialMap.Property, importedTex);
                                                }
                                            }
                                            ;

                                            if (isNormalMap)
                                            {
                                                // Try to auto-detect normal maps
                                                importer.textureType = TextureImporterType.NormalMap;
                                            }
                                            else if (importer.textureType == TextureImporterType.Sprite)
                                            {
                                                // Force disable sprite mode, even for 2D projects
                                                importer.textureType = TextureImporterType.Default;
                                            }

                                            importer.SaveAndReimport();
                                        }
                                        else
                                        {
                                            Debug.LogWarning("GLTFImporter: Unable to import texture from path reference");
                                        }
                                    }
                                };
                            }
                        }
                    }
                }
                else
                {
                    var temp = GameObject.CreatePrimitive(PrimitiveType.Plane);
                    temp.SetActive(false);
                    var defaultMat = new[] { temp.GetComponent <Renderer>().sharedMaterial };
                    DestroyImmediate(temp);

                    foreach (var rend in renderers)
                    {
                        rend.sharedMaterials = defaultMat;
                    }
                }
            }
            catch
            {
                if (gltfScene)
                {
                    DestroyImmediate(gltfScene);
                }
                throw;
            }

#if UNITY_2017_3_OR_NEWER
            // Set main asset
            ctx.AddObjectToAsset("main asset", gltfScene);

            // Add meshes
            foreach (var mesh in meshes)
            {
                ctx.AddObjectToAsset("mesh " + mesh.name, mesh);
            }

            ctx.SetMainObject(gltfScene);
#else
            // Set main asset
            ctx.SetMainAsset("main asset", gltfScene);

            // Add meshes
            foreach (var mesh in meshes)
            {
                ctx.AddSubAsset("mesh " + mesh.name, mesh);
            }
#endif
        }
Ejemplo n.º 25
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            {
                var ext = Path.GetExtension(ctx.assetPath).ToLower();
                if (ext == ".vox")
                {
                    fileType = VoxelBase.FileType.vox;
                }
                else if (ext == ".qb")
                {
                    fileType = VoxelBase.FileType.qb;
                }
                else
                {
                    return;
                }
            }
            var gameObject  = new GameObject(Path.GetFileNameWithoutExtension(ctx.assetPath));
            var voxelObject = gameObject.AddComponent <VoxelObject>();
            {
                voxelObject.legacyVoxImport      = legacyVoxImport;
                voxelObject.importMode           = importMode;
                voxelObject.importScale          = importScale;
                voxelObject.importOffset         = importOffset;
                voxelObject.combineFaces         = combineFaces;
                voxelObject.ignoreCavity         = ignoreCavity;
                voxelObject.voxelStructure       = outputStructure ? ScriptableObject.CreateInstance <VoxelStructure>() : null;
                voxelObject.generateLightmapUVs  = generateLightmapUVs;
                voxelObject.meshFaceVertexOffset = meshFaceVertexOffset;
                voxelObject.loadFromVoxelFile    = loadFromVoxelFile;
                voxelObject.generateMipMaps      = generateMipMaps;
            }
            var objectCore = new VoxelObjectCore(voxelObject);

            try
            {
                if (!objectCore.Create(ctx.assetPath, null))
                {
                    Debug.LogErrorFormat("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath);
                    DestroyImmediate(gameObject);
                    return;
                }
            }
            catch
            {
                Debug.LogErrorFormat("<color=green>[Voxel Importer]</color> ScriptedImporter error. file:{0}", ctx.assetPath);
                DestroyImmediate(gameObject);
                return;
            }

            #region Material
            if (retainExisting)
            {
                bool changed = false;
                var  assets  = AssetDatabase.LoadAllAssetsAtPath(ctx.assetPath);
                for (int i = 0; i < voxelObject.materials.Count; i++)
                {
                    var material = assets.FirstOrDefault(c => c.name == string.Format("mat{0}", i)) as Material;
                    if (material != null)
                    {
                        material.mainTexture     = voxelObject.atlasTexture;
                        voxelObject.materials[i] = material;
                        changed = true;
                    }
                }
                if (changed)
                {
                    var renderer = gameObject.GetComponent <MeshRenderer>();
                    renderer.sharedMaterials = voxelObject.materials.ToArray();
                }
            }
            #endregion

            #region Collider
            switch (colliderType)
            {
            case ColliderType.Box:
                gameObject.AddComponent <BoxCollider>();
                break;

            case ColliderType.Sphere:
                gameObject.AddComponent <SphereCollider>();
                break;

            case ColliderType.Capsule:
                gameObject.AddComponent <CapsuleCollider>();
                break;

            case ColliderType.Mesh:
                gameObject.AddComponent <MeshCollider>();
                break;
            }
            #endregion

#if UNITY_2017_3_OR_NEWER
            ctx.AddObjectToAsset(gameObject.name, gameObject);
            ctx.AddObjectToAsset(voxelObject.mesh.name = "mesh", voxelObject.mesh);
            for (int i = 0; i < voxelObject.materials.Count; i++)
            {
                ctx.AddObjectToAsset(voxelObject.materials[i].name = string.Format("mat{0}", i), voxelObject.materials[i]);
            }
            ctx.AddObjectToAsset(voxelObject.atlasTexture.name = "tex", voxelObject.atlasTexture);
            if (voxelObject.voxelStructure != null)
            {
                ctx.AddObjectToAsset(voxelObject.voxelStructure.name = "structure", voxelObject.voxelStructure);
            }

            VoxelObject.DestroyImmediate(voxelObject);

            ctx.SetMainObject(gameObject);
#else
            ctx.SetMainAsset(gameObject.name, gameObject);
            ctx.AddSubAsset(voxelObject.mesh.name = "mesh", voxelObject.mesh);
            for (int i = 0; i < voxelObject.materials.Count; i++)
            {
                ctx.AddSubAsset(voxelObject.materials[i].name = string.Format("mat{0}", i), voxelObject.materials[i]);
            }
            ctx.AddSubAsset(voxelObject.atlasTexture.name = "tex", voxelObject.atlasTexture);
            if (voxelObject.voxelStructure != null)
            {
                ctx.AddSubAsset(voxelObject.voxelStructure.name = "structure", voxelObject.voxelStructure);
            }

            VoxelObject.DestroyImmediate(voxelObject);
#endif
        }