示例#1
0
        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);
                    }
                }
            }
        }
示例#2
0
        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();
        }
示例#3
0
        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();
        }