QuadStruct structFromQuadTree(QuadTree2 quad) { QuadStruct st = new QuadStruct(); st.level = quad.level; st.maxx = quad.maxx; st.minx = quad.minx; st.maxz = quad.maxz; st.minz = quad.minz; st.NE = -1; st.NW = -1; st.SE = -1; st.SW = -1; st.distance = -1; st.index = -1; st.parent = -1; return(st); }
void populateStructList(QuadTree2 root) { Queue <QuadTree2> structQueue = new Queue <QuadTree2>(); structQueue.Enqueue(root); int count = 0; while (structQueue.Count > 0) { QuadTree2 quad = structQueue.Dequeue(); count++; if (quad == root) { count = 0; } quad.st = structFromQuadTree(quad); quad.st.index = currentIndex++; if (quad.parent != null) { quad.st.parent = quad.parent.st.index; if (count == 4) { int parentIndex = quad.parent.st.index; QuadStruct parentStruct = structList[parentIndex]; parentStruct.NE = quad.parent.a.st.index; parentStruct.NW = quad.parent.b.st.index; parentStruct.SE = quad.parent.c.st.index; parentStruct.SW = quad.parent.d.st.index; structList[parentIndex] = parentStruct; count = 0; } } structList.Add(quad.st); if (quad.a != null) { List <QuadTree2> children = new List <QuadTree2>(); children.Add(quad.a); children.Add(quad.b); children.Add(quad.c); children.Add(quad.d); foreach (QuadTree2 child in children) { structQueue.Enqueue(child); } } } }
void Start() { structList = new List <QuadStruct>(); Init(); populateStructList(QuadTree2.refTree); QuadStruct[] structs = structList.ToArray(); QuadStruct[] structPath = new QuadStruct[20]; if (GPU) { calculateDistances(structs, structList.Count, pointer.transform.position.x, pointer.transform.position.z); createPath(structs, structPath); } else { calculateCosts(QuadTree2.refTree); path = getPath(); } }
private static extern void createPath(QuadStruct[] quadsIn, QuadStruct[] quadsOut);
private static extern void calculateDistances(QuadStruct[] quads, int numberOfQuads, float startx, float starty);
QuadStruct structFromQuadTree(QuadTree2 quad) { QuadStruct st = new QuadStruct(); st.level = quad.level; st.maxx = quad.maxx; st.minx = quad.minx; st.maxz = quad.maxz; st.minz = quad.minz; st.NE = -1; st.NW = -1; st.SE = -1; st.SW = -1; st.distance = -1; st.index = -1; st.parent = -1; return st; }
void Start() { structList = new List<QuadStruct>(); Init(); populateStructList(QuadTree2.refTree); QuadStruct[] structs = structList.ToArray(); QuadStruct[] structPath = new QuadStruct[20]; if (GPU) { calculateDistances(structs, structList.Count, pointer.transform.position.x, pointer.transform.position.z); createPath(structs, structPath); } else { calculateCosts(QuadTree2.refTree); path = getPath(); } }