55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #pragma kernel ConvertTrianglesToDotsKernel
 | |
| 
 | |
| struct TriangleInput {
 | |
| 	float3 p1;
 | |
| 	float3 p2;
 | |
| 	float3 p3;
 | |
| 	};
 | |
| 
 | |
| StructuredBuffer<TriangleInput> triangles;
 | |
| 
 | |
| RWStructuredBuffer<float3> positionOutputs;
 | |
| 
 | |
| float maxDotAmount = 0.225;
 | |
| 
 | |
| float seed = 1.32523252;
 | |
| 
 | |
| int pointCountPerTriangle = 10;
 | |
| float pointsPerUnit = 1;
 | |
| 
 | |
| float rand(float3 co){
 | |
|     return (frac(sin(dot(co ,float3(12.9898,78.233,45.5432))) * 43758.5453));
 | |
|     }
 | |
| 
 | |
| float triangleArea (float3 a, float3 b, float3 c) {
 | |
| 	//for simplicitys sake ignoring the y dimension and finding area of 2D triangle
 | |
| 	return (a.x*(b.z-c.z) + b.x*(c.z-a.z) + c.x*(a.z-b.z))/2.0;
 | |
| 	}
 | |
| 
 | |
| float3 randomPointOnTriangle (float3 a, float3 b, float3 c, float index) {
 | |
| 	float r1 = rand(index*b*seed);
 | |
| 	float r0 = r1 + rand(index*c*seed) * (1-r1);//bigger
 | |
| 	return float3(r1 * a.x + (r0-r1)*b.x + (1-r0)*c.x,
 | |
| 				  r1 * a.y + (r0-r1)*b.y + (1-r0)*c.y,
 | |
| 				  r1 * a.z + (r0-r1)*b.z + (1-r0)*c.z
 | |
| 				  );
 | |
| 	}
 | |
| 
 | |
| [numthreads(16,1,1)]
 | |
| void ConvertTrianglesToDotsKernel (uint3 id : SV_DispatchThreadID)
 | |
| {
 | |
|     TriangleInput tri = triangles[id.x];
 | |
|     int startIndex = id.x*pointCountPerTriangle;
 | |
|     //based on triangle size get point amount
 | |
|     float points = min(triangleArea(tri.p1,tri.p2,tri.p3)*pointsPerUnit,pointCountPerTriangle);
 | |
|     for (int i = 0; i < pointCountPerTriangle; ++i) {
 | |
|     	if(i < points) {
 | |
|     		positionOutputs[startIndex + i] = randomPointOnTriangle(tri.p1,tri.p2,tri.p3, saturate((float)i/(float)points) );//tri.p1 * saturate(1 - (float)i/(float)points) + tri.p2 * saturate((float)i/(float)points);
 | |
|     		}
 | |
|     	else {
 | |
|     		positionOutputs[startIndex + i] = float3(0,0,0);
 | |
|     		}
 | |
|     	
 | |
|     	}
 | |
| }
 |