Ejemplo n.º 1
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        shaderPropId_HierarchyToObjectMat  = Shader.PropertyToID("_HierarchyToObjectMat");
        shaderPorpId_HierarchyToObjectMats = Shader.PropertyToID("_HierarchyToObjectMats");
        shaderPropId_JointLocalMatrix      = Shader.PropertyToID("_JointLocalMatrix");

        localMatrix = Matrix4x4.TRS(position, Quaternion.Euler(eulerAngle), scale);
        mesh        = weaponPrefab.GetComponent <MeshFilter>().sharedMesh;
        material    = new Material(weaponPrefab.GetComponent <MeshRenderer>().sharedMaterial);

#if UNITY_5_5 || UNITY_5_6 || UNITY_5_7 || UNITY_5_8 || UNITY_5_9 || UNITY_6 || UNITY_2017 || UNITY_2018 // etc.
        isBuiltInDrawMeshInstancedSupported = true;
#else
        isBuiltInDrawMeshInstancedSupported = false;
#endif

        if (isBuiltInDrawMeshInstancedSupported)
        {
            material.EnableKeyword("BUILT_IN_DRAW_MESH_INSTANCED_ON");
            material.DisableKeyword("BUILT_IN_DRAW_MESH_INSTANCED_OFF");
        }
        else
        {
            material.EnableKeyword("BUILT_IN_DRAW_MESH_INSTANCED_OFF");
            material.DisableKeyword("BUILT_IN_DRAW_MESH_INSTANCED_ON");
        }
    }
Ejemplo n.º 2
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        newLodMesh           = new Mesh();
        newLodMesh.vertices  = lodMesh.vertices;
        newLodMesh.uv        = lodMesh.uv;
        newLodMesh.triangles = lodMesh.triangles;
        newLodMesh.tangents  = GPUSkinningUtil.ExtractBoneWeights(lodMesh);

        additionalVertexStreames = new GPUSkinning_AdditionalVertexStreames(newLodMesh);

        // Bounding Sphere
        lodBoundingSpheres = new BoundingSphere[gpuSkinning.model.spawnObjects.Length];
        for (int i = 0; i < lodBoundingSpheres.Length; ++i)
        {
            lodBoundingSpheres[i] = new BoundingSphere(gpuSkinning.model.spawnObjects[i].transform.position, 1f);
        }

        // Culling Group
        lodCullingGroup = new CullingGroup();
        lodCullingGroup.targetCamera = Camera.main;
        lodCullingGroup.SetBoundingSpheres(lodBoundingSpheres);
        lodCullingGroup.SetBoundingSphereCount(lodBoundingSpheres.Length);
        lodCullingGroup.SetBoundingDistances(new float[] { 10, 15, 25, 40 });
        lodCullingGroup.SetDistanceReferencePoint(Camera.main.transform);
        lodCullingGroup.onStateChanged = OnLodCullingGroupOnStateChangedHandler;

        newLodMesh.UploadMeshData(true);
    }
Ejemplo n.º 3
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        shaderPropID_TerrainTex  = Shader.PropertyToID("_TerrainTex");
        shaderPropID_TerrainSize = Shader.PropertyToID("_TerrainSize");
        shaderPropID_TerrainPos  = Shader.PropertyToID("_TerrainPos");

        if (terrain != null)
        {
            terrainData = terrain.terrainData;
            terrainSize = terrainData.size;
        }

        if (terrain == null)
        {
            gpuSkinning.model.newMtrl.EnableKeyword("TERRAIN_HEIGHT_OFF");
            gpuSkinning.model.newMtrl.DisableKeyword("TERRAIN_HEIGHT_ON");
        }
        else
        {
            gpuSkinning.model.newMtrl.EnableKeyword("TERRAIN_HEIGHT_ON");
            gpuSkinning.model.newMtrl.DisableKeyword("TERRAIN_HEIGHT_OFF");
        }
    }
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        shaderPropID_Matrices = Shader.PropertyToID("_Matrices");

        matricesUniformBlock = new Matrix4x4[gpuSkinning.GetComponentInChildren <SkinnedMeshRenderer>().bones.Length];
    }
Ejemplo n.º 5
0
    void Start()
    {
        SetupParticles();

        if (m_GPUSkinning)
        {
            gpuSkinning      = gameObject.AddComponent <GPUSkinning>();
            gpuSkinning.root = m_Root;
        }
    }
Ejemplo n.º 6
0
 public static void ExtractBoneAnimMatrix(GPUSkinning gpuSkinning, GPUSkinning_BoneAnimation boneAnimation, System.Action <Matrix4x4, Matrix4x4> boneAnimMatrixCB, System.Action <int> frameCB)
 {
     for (int frameIndex = 0; frameIndex < boneAnimation.frames.Length; ++frameIndex)
     {
         float second = (float)(frameIndex) / (float)boneAnimation.fps;
         gpuSkinning.matrixArray.UpdateBoneAnimationMatrix(null, second);
         int numBones = gpuSkinning.model.bones.Length;
         for (int i = 0; i < numBones; ++i)
         {
             boneAnimMatrixCB(gpuSkinning.model.bones[i].animationMatrix, gpuSkinning.model.bones[i].hierarchyMatrix);
         }
         frameCB(frameIndex);
     }
 }
Ejemplo n.º 7
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        shaderPropID_mpb_time = Shader.PropertyToID("_mpb_time");

        if (CheckGPUInstancingIsSupported())
        {
            gpuSkinning.model.newMtrl.shader.maximumLOD  = 200;
            gpuSkinning.joint.material.shader.maximumLOD = 200;
            SetGPUInstancingMaterialPropertyBlock();
        }
        else
        {
            gpuSkinning.model.newMtrl.shader.maximumLOD  = 100;
            gpuSkinning.joint.material.shader.maximumLOD = 100;
            ClearGPUInstancingMaterialPropertyBlock();
        }
    }
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        if (IsMatricesTextureSupported())
        {
            shaderPropID_MatricesTex       = Shader.PropertyToID("_MatricesTex");
            shaderPropID_MatricesTexSize   = Shader.PropertyToID("_MatricesTexSize");
            shaderPropID_AnimLength        = Shader.PropertyToID("_AnimLength");
            shaderPropID_AnimFPS           = Shader.PropertyToID("_AnimFPS");
            shaderPropID_NumPixelsPerFrame = Shader.PropertyToID("_NumPixelsPerFrame");

            matricesTex            = new Texture2D(matricesTexWidth, matricesTexHeight, TextureFormat.RGBAHalf, false);
            matricesTex.name       = "_MatricesTex";
            matricesTex.filterMode = FilterMode.Point;

            additionalVertexStreames = new GPUSkinning_AdditionalVertexStreames(gpuSkinning.model.newMesh);

            BakeAnimationsToTexture();
        }
    }
Ejemplo n.º 9
0
 public virtual void Init(GPUSkinning gpuSkinning)
 {
     this.gpuSkinning = gpuSkinning;
 }
Ejemplo n.º 10
0
 public virtual void Destroy()
 {
     gpuSkinning = null;
 }
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        if (!SystemInfo.supportsComputeShaders)
        {
            return;
        }

        shaderPropID_Time = Shader.PropertyToID("_GameTime");

        // Material
        Shader shader = Shader.Find("Unlit/ProceduralModel");

        if (!shader.isSupported)
        {
            return;
        }
        proceduralModelMaterial             = new Material(shader);
        proceduralModelMaterial.mainTexture = gpuSkinning.model.newMtrl.mainTexture;

        // Vertices
        int[]     indices  = gpuSkinning.model.newMesh.triangles;
        Vector3[] vertices = gpuSkinning.model.newMesh.vertices;
        Vector4[] tangents = gpuSkinning.model.newMesh.tangents;
        Vector2[] uv       = gpuSkinning.model.newMesh.uv;
        verticesComputeBuffer = new ComputeBuffer(indices.Length, GPUSkinning_ComputeShader_Vertex.size);
        var data = new GPUSkinning_ComputeShader_Vertex[indices.Length];

        for (int i = 0; i < indices.Length; ++i)
        {
            var item = new GPUSkinning_ComputeShader_Vertex();
            item.vertex   = vertices[indices[i]];
            item.tangents = tangents[indices[i]];
            item.uv       = uv[indices[i]];
            data[i]       = item;
        }
        verticesComputeBuffer.SetData(data);
        numVertices_computeBuffer = data.Length;

        // Global Data
        var globalData = new GPUSkinning_CompueteShader_GlobalData();

        globalData.fps        = gpuSkinning.model.boneAnimations[0].fps;
        globalData.animLength = gpuSkinning.model.boneAnimations[0].length;

        // Bone Animation Matrices
        List <GPUSkinning_ComputeShader_Matrix> cbMatricesList = new List <GPUSkinning_ComputeShader_Matrix>();
        int matIndex = 0;

        GPUSkinningUtil.ExtractBoneAnimMatrix(
            gpuSkinning,
            gpuSkinning.model.boneAnimations[0],
            (animMat, hierarchyMat) =>
        {
            var matData = new GPUSkinning_ComputeShader_Matrix();
            matData.mat = animMat;
            cbMatricesList.Add(matData);
            ++matIndex;
        },
            (frameIndex) =>
        {
            if (frameIndex == 0)
            {
                globalData.oneFrameMatricesStride = matIndex;
            }
        }
            );

        matricesComputeBuffer = new ComputeBuffer(cbMatricesList.Count, GPUSkinning_ComputeShader_Matrix.size);
        matricesComputeBuffer.SetData(cbMatricesList.ToArray());

        // Global Data
        globalDataComputeBuffer = new ComputeBuffer(1, GPUSkinning_CompueteShader_GlobalData.size);
        globalDataComputeBuffer.SetData(new GPUSkinning_CompueteShader_GlobalData[] { globalData });

        // Procedural Model Data
        var modelData = new GPUSkinning_ComputeShader_Model[numProceduralInstances];
        int numProceduralModelsPerRow = (int)Mathf.Sqrt(numProceduralInstances);

        for (int i = 0; i < numProceduralInstances; ++i)
        {
            var aModelData = new GPUSkinning_ComputeShader_Model();
            int row        = i / numProceduralModelsPerRow;
            int col        = i - row * numProceduralModelsPerRow;
            aModelData.pos  = new Vector3(-row * proceduralModelGap, -1, -col * proceduralModelGap);
            aModelData.time = Random.Range(0.0f, 10.0f);
            modelData[i]    = aModelData;
        }
        modelDataComputeBuffer = new ComputeBuffer(numProceduralInstances, GPUSkinning_ComputeShader_Model.size);
        modelDataComputeBuffer.SetData(modelData);

        // Draw Procedural Model
        GPUSkinning_Camera.instance.onPostRender += Draw;
    }
Ejemplo n.º 12
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        shaderPropID_Time = Shader.PropertyToID("_GameTime");

        smr  = gpuSkinning.GetComponentInChildren <SkinnedMeshRenderer>();
        mesh = smr.sharedMesh;

        // Init Bones
        int numBones = smr.bones.Length;

        bones = new GPUSkinning_Bone[numBones];
        for (int i = 0; i < numBones; ++i)
        {
            GPUSkinning_Bone bone = new GPUSkinning_Bone();
            bones[i]       = bone;
            bone.transform = smr.bones[i];
            bone.name      = bone.transform.gameObject.name;
            bone.bindpose  = mesh.bindposes[i] /*smr to bone*/;
        }

        // Construct Hierarchy
        for (int i = 0; i < numBones; ++i)
        {
            if (bones[i].transform == smr.rootBone)
            {
                rootBoneIndex = i;
                break;
            }
        }
        System.Action <GPUSkinning_Bone> CollectChildren = null;
        CollectChildren = (currentBone) =>
        {
            List <GPUSkinning_Bone> children = new List <GPUSkinning_Bone>();
            for (int j = 0; j < currentBone.transform.childCount; ++j)
            {
                Transform        childTransform = currentBone.transform.GetChild(j);
                GPUSkinning_Bone childBone      = GetBoneByTransform(childTransform);
                if (childBone != null)
                {
                    childBone.parent = currentBone;
                    children.Add(childBone);
                    CollectChildren(childBone);
                }
            }
            currentBone.children = children.ToArray();
        };
        CollectChildren(bones[rootBoneIndex]);

        // New MeshFilter MeshRenderer
        mf = gpuSkinning.gameObject.AddComponent <MeshFilter>();
        mr = gpuSkinning.gameObject.AddComponent <MeshRenderer>();

        newMtrl = new Material(Shader.Find("Unlit/GPUSkinning"));
        newMtrl.CopyPropertiesFromMaterial(smr.sharedMaterial);
        mr.sharedMaterial = newMtrl;

        // New Mesh
        newMesh           = new Mesh();
        newMesh.vertices  = mesh.vertices;
        newMesh.tangents  = GPUSkinningUtil.ExtractBoneWeights(mesh);
        newMesh.uv        = mesh.uv;
        newMesh.triangles = mesh.triangles;
        mf.sharedMesh     = newMesh;

#if UNITY_EDITOR
        // Extract bone animation data
        int boneAnimationsCount = 0;
        boneAnimations = new GPUSkinning_BoneAnimation[gpuSkinning.GetComponent <Animator>().runtimeAnimatorController.animationClips.Length];
        foreach (AnimationClip animClip in gpuSkinning.GetComponent <Animator>().runtimeAnimatorController.animationClips)
        {
            GPUSkinning_BoneAnimation boneAnimation = ScriptableObject.CreateInstance <GPUSkinning_BoneAnimation>();
            boneAnimation.fps      = 60;
            boneAnimation.animName = animClip.name;
            boneAnimation.frames   = new GPUSkinning_BoneAnimationFrame[(int)(animClip.length * boneAnimation.fps)];
            boneAnimation.length   = animClip.length;
            boneAnimations[boneAnimationsCount++] = boneAnimation;

            for (int frameIndex = 0; frameIndex < boneAnimation.frames.Length; ++frameIndex)
            {
                GPUSkinning_BoneAnimationFrame frame = new GPUSkinning_BoneAnimationFrame();
                boneAnimation.frames[frameIndex] = frame;
                float second = (float)(frameIndex) / (float)boneAnimation.fps;

                List <GPUSkinning_Bone> bones2              = new List <GPUSkinning_Bone>();
                List <Matrix4x4>        matrices            = new List <Matrix4x4>();
                List <string>           bonesHierarchyNames = null; if (boneAnimation.bonesHierarchyNames == null)
                {
                    bonesHierarchyNames = new List <string>();
                }
                EditorCurveBinding[] curvesBinding = AnimationUtility.GetCurveBindings(animClip);
                foreach (var curveBinding in curvesBinding)
                {
                    GPUSkinning_Bone bone = GetBoneByHierarchyName(curveBinding.path);

                    if (bones2.Contains(bone))
                    {
                        continue;
                    }
                    bones2.Add(bone);

                    if (bonesHierarchyNames != null)
                    {
                        bonesHierarchyNames.Add(GetBoneHierarchyName(bone));
                    }

                    AnimationCurve curveRX = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalRotation.x");
                    AnimationCurve curveRY = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalRotation.y");
                    AnimationCurve curveRZ = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalRotation.z");
                    AnimationCurve curveRW = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalRotation.w");

                    AnimationCurve curvePX = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalPosition.x");
                    AnimationCurve curvePY = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalPosition.y");
                    AnimationCurve curvePZ = AnimationUtility.GetEditorCurve(animClip, curveBinding.path, curveBinding.type, "m_LocalPosition.z");

                    float curveRX_v = curveRX.Evaluate(second);
                    float curveRY_v = curveRY.Evaluate(second);
                    float curveRZ_v = curveRZ.Evaluate(second);
                    float curveRW_v = curveRW.Evaluate(second);

                    float curvePX_v = curvePX.Evaluate(second);
                    float curvePY_v = curvePY.Evaluate(second);
                    float curvePZ_v = curvePZ.Evaluate(second);

                    Vector3    translation = new Vector3(curvePX_v, curvePY_v, curvePZ_v);
                    Quaternion rotation    = new Quaternion(curveRX_v, curveRY_v, curveRZ_v, curveRW_v);
                    NormalizeQuaternion(ref rotation);
                    matrices.Add(
                        Matrix4x4.TRS(translation, rotation, Vector3.one)
                        );
                }

                frame.bones    = bones2.ToArray();
                frame.matrices = matrices.ToArray();
                if (boneAnimation.bonesHierarchyNames == null)
                {
                    boneAnimation.bonesHierarchyNames = bonesHierarchyNames.ToArray();
                }
            }
        }
        // Save as ScriptableObject
        AssetDatabase.CreateAsset(boneAnimations[0], "Assets/GPUSkinning/Resources/anim0.asset");
        AssetDatabase.Refresh();
#else
        // Read from ScriptableObject directly
        boneAnimations = new GPUSkinning_BoneAnimation[] { Resources.Load("anim0") as GPUSkinning_BoneAnimation };
        foreach (var boneAnimation in boneAnimations)
        {
            foreach (var frame in boneAnimation.frames)
            {
                int numBones2 = boneAnimation.bonesHierarchyNames.Length;
                frame.bones = new GPUSkinning_Bone[numBones2];
                for (int i = 0; i < numBones2; ++i)
                {
                    frame.bones[i] = GetBoneByHierarchyName(boneAnimation.bonesHierarchyNames[i]);
                }
            }
        }
#endif

        // Spawn many models
        if (spawnPoints != null)
        {
            List <GPUSkinning_SpawnObject> list = new List <GPUSkinning_SpawnObject>();
            for (int i = 0; i < spawnPoints.Length; ++i)
            {
                for (int j = 0; j < spawnPoints[i].childCount; ++j)
                {
                    GPUSkinning_SpawnObject spawnObject = new GPUSkinning_SpawnObject();
                    list.Add(spawnObject);
                    spawnObject.transform         = spawnPoints[i].GetChild(j);
                    spawnObject.mf                = spawnObject.transform.gameObject.AddComponent <MeshFilter>();
                    spawnObject.mr                = spawnObject.transform.gameObject.AddComponent <MeshRenderer>();
                    spawnObject.mr.sharedMaterial = newMtrl;
                    spawnObject.mf.sharedMesh     = newMesh;
                }
            }
            spawnObjects = list.ToArray();
        }
    }
Ejemplo n.º 13
0
    public override void Init(GPUSkinning gpuSkinning)
    {
        base.Init(gpuSkinning);

        SetPlayMode0();
    }