//public bool autoRefresh = false; public override void OnInspectorGUI() { base.OnInspectorGUI(); ComputeShaderFur furGenerator = (ComputeShaderFur)target; if (GUILayout.Button("Generate Fur")) { furGenerator.GenerateFur(); } }
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(); }