public void ViewUpdated(Vector3 viewPos) { // TODO: determine if tree changes needed // TODO: Combine vis testing with tree demPQT.Fork(1, false); demPQT.Children[3].Fork(1, false); demPQT.Children[3].Children[3].Fork(1, false); demPQT.Children[1].Fork(1, false); demPQT.Children[1].Children[3].Fork(1, false); demPQT.Children[1].Children[1].Fork(1, false); // build local objects needed SourceDataDiffuseSampler sampler = new SourceDataDiffuseSampler(); NormalMapGenerator normalGen = new NormalMapGenerator(); foreach (PureQuadTreeNode leaf in demPQT) { if (leaf.Level != 0) { // trace each leaf to see if patches required ulong[] codes; byte dirs = TraceLeaf(leaf, out codes); TestInternals(leaf, ref codes); // create object geometryTree.Add(new GpuDemSubGeometry(leaf.Location, leaf.Size, leaf.Centre, null, leaf.Code, leaf.Level, codes, (byte)leaf.ChildNum)); // find matching data node and create texture if needed if (!texturesCache.ContainsKey(leaf.Code)) { Point pos = new Point((int)(leaf.Location.X / 10f * /*1024f*/ 2048f), (int)(leaf.Location.Y / 10f * /*1024f*/ 2048f)); // find corrosponding node Texture texture = null, normalTex = null; for (int node = 0; node < dataNodes[leaf.Level].Length; node++) { if (dataNodes[leaf.Level][node].NodeArea.Location == pos) { texture = //TextureLoader.FromFile(gDevice, "c:/0-test.jpg"); sampler.GenerateTexture(new Size(16, 16), dataNodes[leaf.Level][node].Rectangles[0], gDevice, reader); normalTex = normalGen.GenerateTexture(new Size(256, 256), dataNodes[leaf.Level][node].Rectangles[0], gDevice, reader); } } texturesCache[leaf.Code] = new CachedTexture(texture, leaf.Code, leaf.Level, normalTex); } } } }
public Form1() { InitializeComponent(); PureQuadTree tree = new PureQuadTree(new Vector2(), new Vector2(256, 256)); tree.Fork(1, false); tree.Children[3].Fork(1, false); tree.Children[1].Fork(1, false); //tree.Children[3].Children[3].Fork(1, false); //tree.Children[1].Fork(2, false); ////tree.Children[2].Fork(1, false); //tree.Children[3].Children[1].Fork(1, false); //leafPatches = new Dictionary<ulong, byte>(); //patchLevels = new Dictionary<ulong, ushort[]>(); //foreach (PureQuadTreeNode leaf in tree) //{ // if (leaf.Level > 0) // { // TraceLeaf(leaf); // } //} qTree = tree;// new PureQuadTree(new Vector2(), new Vector2(256, 256)); viewPos = new Vector2(200, 300); viewDir = Vector2.Normalize(new Vector2(128, 128) - viewPos); falloff = 250; Vector3 viewDir3 = new Vector3(viewDir.X, 0, viewDir.Y); Quaternion q = Quaternion.RotationAxis(new Vector3(0, 1, 0), (float)Math.PI / 8); Matrix rot = Matrix.RotationQuaternion(q); Vector4 temp = Vector3.Transform(viewDir3, rot); viewFOVp1 = new Vector2(temp.X, temp.Z); viewFOVp1.Normalize(); viewFOVp1 = new Vector2(viewPos.X + (viewFOVp1 * falloff).X, viewPos.Y + (viewFOVp1 * falloff).Y); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), -(float)Math.PI / 8); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); viewFOVp2 = new Vector2(temp.X, temp.Z); viewFOVp2.Normalize(); viewFOVp2 = new Vector2(viewPos.X + (viewFOVp2 * falloff).X, viewPos.Y + (viewFOVp2 * falloff).Y); Vector3 viewPos3 = new Vector3(viewPos.X, 0, viewPos.Y); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), ((float)Math.PI / 8) + ((float)Math.PI / 2)); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); Vector3 v3 = new Vector3(-temp.X, 0, -temp.Z); v3.Normalize(); viewFOVpl1 = Plane.FromPointNormal(viewPos3, v3); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), -((float)Math.PI / 8) - ((float)Math.PI / 2)); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); v3 = new Vector3(-temp.X, 0, -temp.Z); v3.Normalize(); viewFOVpl2 = Plane.FromPointNormal(viewPos3, v3); //Plane.FromPoints(viewDir3, new Vector3(viewDir3.X, 1, viewDir3.Z), new Vector3(viewDir3.X + viewFOVp2.X, 0, viewDir3.Z + viewFOVp2.Y)); leafDetail = new Dictionary <ulong, short>(); BuildTree(); }
public Form1() { InitializeComponent(); PureQuadTree tree = new PureQuadTree(new Vector2(), new Vector2(256, 256)); tree.Fork(1, false); tree.Children[3].Fork(1, false); tree.Children[1].Fork(1, false); //tree.Children[3].Children[3].Fork(1, false); //tree.Children[1].Fork(2, false); ////tree.Children[2].Fork(1, false); //tree.Children[3].Children[1].Fork(1, false); //leafPatches = new Dictionary<ulong, byte>(); //patchLevels = new Dictionary<ulong, ushort[]>(); //foreach (PureQuadTreeNode leaf in tree) //{ // if (leaf.Level > 0) // { // TraceLeaf(leaf); // } //} qTree = tree;// new PureQuadTree(new Vector2(), new Vector2(256, 256)); viewPos = new Vector2(200, 300); viewDir = Vector2.Normalize(new Vector2(128, 128) - viewPos); falloff = 250; Vector3 viewDir3 = new Vector3(viewDir.X, 0, viewDir.Y); Quaternion q = Quaternion.RotationAxis(new Vector3(0, 1, 0), (float)Math.PI / 8); Matrix rot = Matrix.RotationQuaternion(q); Vector4 temp = Vector3.Transform(viewDir3, rot); viewFOVp1 = new Vector2(temp.X, temp.Z); viewFOVp1.Normalize(); viewFOVp1 = new Vector2(viewPos.X + (viewFOVp1 * falloff).X, viewPos.Y + (viewFOVp1 * falloff).Y); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), -(float)Math.PI / 8); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); viewFOVp2 = new Vector2(temp.X, temp.Z); viewFOVp2.Normalize(); viewFOVp2 = new Vector2(viewPos.X + (viewFOVp2 * falloff).X, viewPos.Y + (viewFOVp2 * falloff).Y); Vector3 viewPos3 = new Vector3(viewPos.X, 0, viewPos.Y); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), ((float)Math.PI / 8) + ((float)Math.PI / 2)); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); Vector3 v3 = new Vector3(-temp.X, 0, -temp.Z); v3.Normalize(); viewFOVpl1 = Plane.FromPointNormal(viewPos3, v3); q = Quaternion.RotationAxis(new Vector3(0, 1, 0), -((float)Math.PI / 8) - ((float)Math.PI / 2)); rot = Matrix.RotationQuaternion(q); temp = Vector3.Transform(viewDir3, rot); v3 = new Vector3(-temp.X, 0, -temp.Z); v3.Normalize(); viewFOVpl2 = Plane.FromPointNormal(viewPos3, v3); //Plane.FromPoints(viewDir3, new Vector3(viewDir3.X, 1, viewDir3.Z), new Vector3(viewDir3.X + viewFOVp2.X, 0, viewDir3.Z + viewFOVp2.Y)); leafDetail = new Dictionary<ulong, short>(); BuildTree(); }