Пример #1
0
    //public bool autoRefresh = false;
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        ComputeShaderFur furGenerator = (ComputeShaderFur)target;

        if (GUILayout.Button("Generate Fur"))
        {
            furGenerator.GenerateFur();
        }
    }
Пример #2
0
    public void GenerateFur()
    {
        int furAmount = furTexResolutionX * furTexResolutionY;

        //furMeshBuilder = GetComponentInChildren<FurMeshBuilder>();
        //furMaterial = furMeshBuilder.GetComponent<Renderer>().sharedMaterial;

        cmpShaderFur = GetComponent <ComputeShaderFur>();
        CreateBuffers();

        _kernel = cmpShaderFur.computeShader.FindKernel(kernalName);

        if (furType == FurType.Fur)
        {
            cmpShaderFur.computeShader.SetInt("_FurType", 0);
        }
        else if (furType == FurType.FabricFraying)
        {
            cmpShaderFur.computeShader.SetInt("_FurType", 1);
        }
        else if (furType == FurType.FabricTear)
        {
            cmpShaderFur.computeShader.SetInt("_FurType", 2);
        }

        cmpShaderFur.computeShader.SetInt("_FurTexResX", furTexResolutionX);
        cmpShaderFur.computeShader.SetInt("_FurTexResY", furTexResolutionY);

        cmpShaderFur.computeShader.SetFloat("_TearInt", TearInt);

        for (int i = gameObject.transform.childCount - 1; i >= 0; i--)
        {
            GameObject child = gameObject.transform.GetChild(i).gameObject;
            GameObject.DestroyImmediate(child);
        }

        for (int k = 0; k < furAmountMultiplier; k++)
        {
            cmpShaderFur.computeShader.SetFloat("_FurIteration", k);

            int csOutputBufferSize = furInputAttributeCount * 3 + furInputAttributeCountVec4 * 4; // 8 vector 3, according to my current compute shader

            System.Array bufferContent = new float[furAmount, furSegCount *csOutputBufferSize];

            Dispatch(k);

            outputBuffer.GetData(bufferContent);

            FurDataList furDataList = new FurDataList();

            for (int f = 0; f < furAmount; f++)
            {
                for (int s = 0; s < furSegCount; s++)
                {
                    FurVertexFormat vert = GetFurVert(bufferContent, f, s * csOutputBufferSize);

                    float mask = vert.pos0[3];
                    if (mask > 0.0f)
                    {
                        furDataList.pos0List.Add(vert.pos0);
                        furDataList.clumpPos0List.Add(vert.clumpPos0);
                        furDataList.twistPos0List.Add(vert.twistPos0);
                        furDataList.dataPackList.Add(vert.dataPack);
                        furDataList.dataPack2List.Add(vert.dataPack2);
                        furDataList.dataPack3List.Add(vert.dataPack3);
                    }
                }
            }

            int[] triangle = new int[furDataList.pos0List.Count];
            for (int f = 0; f < triangle.Length; f++)
            {
                triangle[f] = f;
            }


            GameObject newMeshBuilder = new GameObject();
            newMeshBuilder.AddComponent <FurMeshBuilder>();
            newMeshBuilder.AddComponent <MeshFilter>();
            newMeshBuilder.AddComponent <MeshRenderer>();
            newMeshBuilder.GetComponent <MeshRenderer>().sharedMaterial = furMaterial;
            newMeshBuilder.transform.parent = transform;
            newMeshBuilder.name             = "FurBuilder_" + k.ToString();

            newMeshBuilder.GetComponent <FurMeshBuilder>().BuildMesh(
                furDataList.pos0List,
                furDataList.clumpPos0List,
                furDataList.twistPos0List,
                furDataList.dataPackList,
                furDataList.dataPack2List,
                furDataList.dataPack3List,
                triangle);
        }

        ReleaseBuffer();
    }