Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.08 KB | None | 0 0
  1. //Algorytm przygotowuje vertexy do renderowania z użyciem frustum cullingu
  2. //Dzieli całą scenę na 4 prostopadłościany, których wysokość jest równa wysokości
  3. //sceny, a następnie każdy prostopadłościan w ten sam sposób rekurencyjnie
  4.  
  5. class TripleVertex
  6. {
  7. public VertexPositionColorTexture[] v = new VertexPositionColorTexture[3];
  8. }
  9.  
  10. TripleVertex[] tritab;
  11. tritab = new TripleVertex[boxtab.Length/3];
  12.  
  13. private void Frustum(int offset,int length, Vector2 start,Vector2 end)
  14. {
  15. if(length<100)return;
  16. int[] offsets = new int[4];
  17. int[] lengths = new int[4];
  18. offsets[0] = offset;
  19. lenghts[0] = length/4;
  20. offsets[1] = offsets[0]+lenghts[0];
  21. lenghts[1] = length/4;
  22. offsets[2] = offsets[1]+lenghts[1];
  23. lengths[2] = length/4;
  24. offsets[3] = offsets[2]+lenghts[2];
  25. lengths[3] = length-offsets[0]-offsets[1]-offsets[2];
  26.  
  27.  
  28. Vector2 center = (start + end)/2.0f;
  29. Vector2 botmid = new Vector2(center.X,start.Y);
  30. Vector2 midrig = new Vector2(end.X,center.Y);
  31. Vector2 midlef = new Vector2(start.X,center.Y);
  32. Vector2 topmid = new Vector2(center.X,end.Y);
  33.  
  34. for(int la=0;la<4;la++)
  35.     {
  36.     Vector2 vs;
  37.     Vector2 ve;
  38.     switch(la)
  39.         {
  40.         case 0:
  41.             vs = center;
  42.             ve = end;
  43.             break;
  44.         case 1:
  45.             vs = midlef;
  46.             ve = topmid;
  47.             break;
  48.             case 2:
  49.             vs = start;
  50.             ve = center;
  51.             break;
  52.         case 3:
  53.             vs = botmid;
  54.             ve = midrig;
  55.             break;
  56.     }
  57.     int beginIndex = offsets[la];
  58.     int endIndex = offsets[la]+length[la];
  59.     int i = 0;
  60.     for(int lb=offset;lb<offset+length;lb++)
  61.         {
  62.         if((lb>=offsets[la])&&(lb<offsets[la]+lengths[la]))continue;
  63.         if(IsInside(tritab[lb],vs,ve)
  64.         {
  65.             Swap(lb,offsets[la]+i);
  66.             i++;
  67.         }
  68.         if(i>=offsets[la]+lengths[la])break;
  69.     }
  70. }
  71. Frustum(offsets[0],lengths[0],center,end);
  72. Frustum(offsets[1],lengths[1],midlef,topmid);
  73. Frustum(offsets[2],lengths[2],start,center);
  74. Frustum(offsets[3],lengths[3],botmid,midrig);
  75. }
  76.  
  77. private bool IsInside(TripleVertex tri,Vector2 start,Vector2 end)
  78. {
  79. //czy dany face zawiera sie w kwadracie o rogach po przekątnej start i end
  80. }
  81.  
  82. private void Swap(int a,int b)
  83. {
  84. //Zamiana w tablicy boxtab elementu a z elementem b
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement