Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Algorytm przygotowuje vertexy do renderowania z użyciem frustum cullingu
- //Dzieli całą scenę na 4 prostopadłościany, których wysokość jest równa wysokości
- //sceny, a następnie każdy prostopadłościan w ten sam sposób rekurencyjnie
- class TripleVertex
- {
- public VertexPositionColorTexture[] v = new VertexPositionColorTexture[3];
- }
- TripleVertex[] tritab;
- tritab = new TripleVertex[boxtab.Length/3];
- private void Frustum(int offset,int length, Vector2 start,Vector2 end)
- {
- if(length<100)return;
- int[] offsets = new int[4];
- int[] lengths = new int[4];
- offsets[0] = offset;
- lenghts[0] = length/4;
- offsets[1] = offsets[0]+lenghts[0];
- lenghts[1] = length/4;
- offsets[2] = offsets[1]+lenghts[1];
- lengths[2] = length/4;
- offsets[3] = offsets[2]+lenghts[2];
- lengths[3] = length-offsets[0]-offsets[1]-offsets[2];
- Vector2 center = (start + end)/2.0f;
- Vector2 botmid = new Vector2(center.X,start.Y);
- Vector2 midrig = new Vector2(end.X,center.Y);
- Vector2 midlef = new Vector2(start.X,center.Y);
- Vector2 topmid = new Vector2(center.X,end.Y);
- for(int la=0;la<4;la++)
- {
- Vector2 vs;
- Vector2 ve;
- switch(la)
- {
- case 0:
- vs = center;
- ve = end;
- break;
- case 1:
- vs = midlef;
- ve = topmid;
- break;
- case 2:
- vs = start;
- ve = center;
- break;
- case 3:
- vs = botmid;
- ve = midrig;
- break;
- }
- int beginIndex = offsets[la];
- int endIndex = offsets[la]+length[la];
- int i = 0;
- for(int lb=offset;lb<offset+length;lb++)
- {
- if((lb>=offsets[la])&&(lb<offsets[la]+lengths[la]))continue;
- if(IsInside(tritab[lb],vs,ve)
- {
- Swap(lb,offsets[la]+i);
- i++;
- }
- if(i>=offsets[la]+lengths[la])break;
- }
- }
- Frustum(offsets[0],lengths[0],center,end);
- Frustum(offsets[1],lengths[1],midlef,topmid);
- Frustum(offsets[2],lengths[2],start,center);
- Frustum(offsets[3],lengths[3],botmid,midrig);
- }
- private bool IsInside(TripleVertex tri,Vector2 start,Vector2 end)
- {
- //czy dany face zawiera sie w kwadracie o rogach po przekątnej start i end
- }
- private void Swap(int a,int b)
- {
- //Zamiana w tablicy boxtab elementu a z elementem b
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement