FurVertexFormat GetFurVert(System.Array bufferContent, int furIndex, int vertIndex) { FurVertexFormat vert = new FurVertexFormat { pos0 = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex), (float)bufferContent.GetValue(furIndex, vertIndex + 1), (float)bufferContent.GetValue(furIndex, vertIndex + 2), (float)bufferContent.GetValue(furIndex, vertIndex + 3)), clumpPos0 = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex + 4), (float)bufferContent.GetValue(furIndex, vertIndex + 5), (float)bufferContent.GetValue(furIndex, vertIndex + 6)), twistPos0 = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex + 7), (float)bufferContent.GetValue(furIndex, vertIndex + 8), (float)bufferContent.GetValue(furIndex, vertIndex + 9)), dataPack = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex + 10), (float)bufferContent.GetValue(furIndex, vertIndex + 11), (float)bufferContent.GetValue(furIndex, vertIndex + 12), (float)bufferContent.GetValue(furIndex, vertIndex + 13)), dataPack2 = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex + 14), (float)bufferContent.GetValue(furIndex, vertIndex + 15), (float)bufferContent.GetValue(furIndex, vertIndex + 16), (float)bufferContent.GetValue(furIndex, vertIndex + 17)), dataPack3 = new Vector4((float)bufferContent.GetValue(furIndex, vertIndex + 18), (float)bufferContent.GetValue(furIndex, vertIndex + 19), (float)bufferContent.GetValue(furIndex, vertIndex + 20), (float)bufferContent.GetValue(furIndex, vertIndex + 21)), }; return(vert); }
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(); }