OSDN Git Service

Move back loading of the avatar_lad to constructor.
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 15:40:22 +0000 (15:40 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 15:40:22 +0000 (15:40 +0000)
Experimentatl occlusion culling (only marginal improvement, implemenation prolly not efficient)

git-svn-id: https://radegast.googlecode.com/svn/trunk@977 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.Designer.cs
Radegast/GUI/Rendering/Rendering.cs
Radegast/GUI/Rendering/RenderingHelpers.cs

index a412d67..cef5a90 100644 (file)
@@ -61,6 +61,11 @@ namespace Radegast.Rendering
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SceneWindow));\r
             this.gbZoom = new System.Windows.Forms.GroupBox();\r
+            this.cbOcclusion = new System.Windows.Forms.CheckBox();\r
+            this.button_driver = new System.Windows.Forms.Button();\r
+            this.textBox_driveramount = new System.Windows.Forms.TextBox();\r
+            this.label6 = new System.Windows.Forms.Label();\r
+            this.comboBox_driver = new System.Windows.Forms.ComboBox();\r
             this.button1 = new System.Windows.Forms.Button();\r
             this.textBox_morphamount = new System.Windows.Forms.TextBox();\r
             this.label5 = new System.Windows.Forms.Label();\r
@@ -91,16 +96,13 @@ namespace Radegast.Rendering
             this.takeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.returnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.button_driver = new System.Windows.Forms.Button();\r
-            this.textBox_driveramount = new System.Windows.Forms.TextBox();\r
-            this.label6 = new System.Windows.Forms.Label();\r
-            this.comboBox_driver = new System.Windows.Forms.ComboBox();\r
             this.gbZoom.SuspendLayout();\r
             this.ctxObjects.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // gbZoom\r
             // \r
+            this.gbZoom.Controls.Add(this.cbOcclusion);\r
             this.gbZoom.Controls.Add(this.button_driver);\r
             this.gbZoom.Controls.Add(this.textBox_driveramount);\r
             this.gbZoom.Controls.Add(this.label6);\r
@@ -131,11 +133,57 @@ namespace Radegast.Rendering
             this.gbZoom.Dock = System.Windows.Forms.DockStyle.Bottom;\r
             this.gbZoom.Location = new System.Drawing.Point(0, 441);\r
             this.gbZoom.Name = "gbZoom";\r
-            this.gbZoom.Size = new System.Drawing.Size(644, 163);\r
+            this.gbZoom.Size = new System.Drawing.Size(886, 163);\r
             this.gbZoom.TabIndex = 8;\r
             this.gbZoom.TabStop = false;\r
             this.gbZoom.Enter += new System.EventHandler(this.gbZoom_Enter);\r
             // \r
+            // cbOcclusion\r
+            // \r
+            this.cbOcclusion.AutoSize = true;\r
+            this.cbOcclusion.Location = new System.Drawing.Point(638, 19);\r
+            this.cbOcclusion.Name = "cbOcclusion";\r
+            this.cbOcclusion.Size = new System.Drawing.Size(107, 17);\r
+            this.cbOcclusion.TabIndex = 47;\r
+            this.cbOcclusion.Text = "Occlusion Culling";\r
+            this.cbOcclusion.UseVisualStyleBackColor = true;\r
+            this.cbOcclusion.CheckedChanged += new System.EventHandler(this.cbOcclusion_CheckedChanged);\r
+            // \r
+            // button_driver\r
+            // \r
+            this.button_driver.Location = new System.Drawing.Point(277, 140);\r
+            this.button_driver.Name = "button_driver";\r
+            this.button_driver.Size = new System.Drawing.Size(75, 23);\r
+            this.button_driver.TabIndex = 46;\r
+            this.button_driver.Text = "Driver";\r
+            this.button_driver.UseVisualStyleBackColor = true;\r
+            this.button_driver.Click += new System.EventHandler(this.button_driver_Click);\r
+            // \r
+            // textBox_driveramount\r
+            // \r
+            this.textBox_driveramount.Location = new System.Drawing.Point(204, 142);\r
+            this.textBox_driveramount.Name = "textBox_driveramount";\r
+            this.textBox_driveramount.Size = new System.Drawing.Size(67, 20);\r
+            this.textBox_driveramount.TabIndex = 45;\r
+            this.textBox_driveramount.Text = "0";\r
+            // \r
+            // label6\r
+            // \r
+            this.label6.AutoSize = true;\r
+            this.label6.Location = new System.Drawing.Point(9, 144);\r
+            this.label6.Name = "label6";\r
+            this.label6.Size = new System.Drawing.Size(35, 13);\r
+            this.label6.TabIndex = 44;\r
+            this.label6.Text = "Driver";\r
+            // \r
+            // comboBox_driver\r
+            // \r
+            this.comboBox_driver.FormattingEnabled = true;\r
+            this.comboBox_driver.Location = new System.Drawing.Point(74, 141);\r
+            this.comboBox_driver.Name = "comboBox_driver";\r
+            this.comboBox_driver.Size = new System.Drawing.Size(121, 21);\r
+            this.comboBox_driver.TabIndex = 43;\r
+            // \r
             // button1\r
             // \r
             this.button1.Location = new System.Drawing.Point(277, 114);\r
@@ -446,46 +494,11 @@ namespace Radegast.Rendering
             this.deleteToolStripMenuItem.Text = "Delete";\r
             this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);\r
             // \r
-            // button_driver\r
-            // \r
-            this.button_driver.Location = new System.Drawing.Point(277, 140);\r
-            this.button_driver.Name = "button_driver";\r
-            this.button_driver.Size = new System.Drawing.Size(75, 23);\r
-            this.button_driver.TabIndex = 46;\r
-            this.button_driver.Text = "Driver";\r
-            this.button_driver.UseVisualStyleBackColor = true;\r
-            this.button_driver.Click += new System.EventHandler(this.button_driver_Click);\r
-            // \r
-            // textBox_driveramount\r
-            // \r
-            this.textBox_driveramount.Location = new System.Drawing.Point(204, 142);\r
-            this.textBox_driveramount.Name = "textBox_driveramount";\r
-            this.textBox_driveramount.Size = new System.Drawing.Size(67, 20);\r
-            this.textBox_driveramount.TabIndex = 45;\r
-            this.textBox_driveramount.Text = "0";\r
-            // \r
-            // label6\r
-            // \r
-            this.label6.AutoSize = true;\r
-            this.label6.Location = new System.Drawing.Point(9, 144);\r
-            this.label6.Name = "label6";\r
-            this.label6.Size = new System.Drawing.Size(35, 13);\r
-            this.label6.TabIndex = 44;\r
-            this.label6.Text = "Driver";\r
-            // \r
-            // comboBox_driver\r
-            // \r
-            this.comboBox_driver.FormattingEnabled = true;\r
-            this.comboBox_driver.Location = new System.Drawing.Point(74, 141);\r
-            this.comboBox_driver.Name = "comboBox_driver";\r
-            this.comboBox_driver.Size = new System.Drawing.Size(121, 21);\r
-            this.comboBox_driver.TabIndex = 43;\r
-            // \r
             // SceneWindow\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.ClientSize = new System.Drawing.Size(644, 604);\r
+            this.ClientSize = new System.Drawing.Size(886, 604);\r
             this.Controls.Add(this.gbZoom);\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
             this.Name = "SceneWindow";\r
@@ -535,6 +548,7 @@ namespace Radegast.Rendering
         private System.Windows.Forms.TextBox textBox_driveramount;\r
         private System.Windows.Forms.Label label6;\r
         private System.Windows.Forms.ComboBox comboBox_driver;\r
+        private System.Windows.Forms.CheckBox cbOcclusion;\r
 \r
     }\r
 }\r
index a6c21fb..62f706e 100644 (file)
@@ -85,6 +85,22 @@ namespace Radegast.Rendering
         List<SceneObject> SortedObjects;\r
         Dictionary<uint, RenderAvatar> Avatars = new Dictionary<uint, RenderAvatar>();\r
 \r
+        /// <summary>\r
+        /// Render prims\r
+        /// </summary>\r
+        public bool PrimitiveRenderingEnabled = true;\r
+\r
+        /// <summary>\r
+        /// Render avatars\r
+        /// </summary>\r
+        public bool AvatarRenderingEnabled = true;\r
+\r
+        /// <summary>\r
+        /// Enable occlusion culling\r
+        /// </summary>\r
+        bool OcclusionCullingEnabled = false;\r
+\r
+\r
         #endregion Public fields\r
 \r
         #region Private fields\r
@@ -140,6 +156,18 @@ namespace Radegast.Rendering
             Camera = new Camera();\r
             InitCamera();\r
 \r
+            GLAvatar.loadlindenmeshes2("avatar_lad.xml");\r
+\r
+            foreach (VisualParamEx vpe in VisualParamEx.morphParams.Values)\r
+            {\r
+                comboBox_morph.Items.Add(vpe.Name);\r
+            }\r
+\r
+            foreach (VisualParamEx vpe in VisualParamEx.drivenParams.Values)\r
+            {\r
+                comboBox_driver.Items.Add(vpe.Name);\r
+            }\r
+\r
             Client.Objects.TerseObjectUpdate += new EventHandler<TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate);\r
             Client.Objects.ObjectUpdate += new EventHandler<PrimEventArgs>(Objects_ObjectUpdate);\r
             Client.Objects.ObjectDataBlockUpdate += new EventHandler<ObjectDataBlockUpdateEventArgs>(Objects_ObjectDataBlockUpdate);\r
@@ -676,7 +704,7 @@ namespace Radegast.Rendering
                             }\r
                             else if (ModifierKeys == Keys.Alt)\r
                             {\r
-                                Camera.FocalPoint = PrimPos(picked.Prim);\r
+                                Camera.FocalPoint = picked.SimPosition;\r
                                 Cursor.Position = glControl.PointToScreen(new Point(glControl.Width / 2, glControl.Height / 2));\r
                             }\r
                         }\r
@@ -685,7 +713,7 @@ namespace Radegast.Rendering
                             RenderAvatar av = (RenderAvatar)clicked;\r
                             if (ModifierKeys == Keys.Alt)\r
                             {\r
-                                Vector3 pos = PrimPos(av.avatar);\r
+                                Vector3 pos = av.SimPosition;\r
                                 pos.Z += 1.5f; // focus roughly on the chest area\r
                                 Camera.FocalPoint = pos;\r
                                 Cursor.Position = glControl.PointToScreen(new Point(glControl.Width / 2, glControl.Height / 2));\r
@@ -851,53 +879,44 @@ namespace Radegast.Rendering
 \r
             ThreadPool.QueueUserWorkItem(sync =>\r
             {\r
-                List<Primitive> mainPrims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll((Primitive root) => root.ParentID == 0);\r
-                foreach (Primitive mainPrim in mainPrims)\r
+                if (PrimitiveRenderingEnabled)\r
                 {\r
-                    UpdatePrimBlocking(mainPrim);\r
-                    Client.Network.CurrentSim.ObjectsPrimitives\r
-                        .FindAll((Primitive child) => child.ParentID == mainPrim.LocalID)\r
-                        .ForEach((Primitive subPrim) => UpdatePrimBlocking(subPrim));\r
+                    List<Primitive> mainPrims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll((Primitive root) => root.ParentID == 0);\r
+                    foreach (Primitive mainPrim in mainPrims)\r
+                    {\r
+                        UpdatePrimBlocking(mainPrim);\r
+                        Client.Network.CurrentSim.ObjectsPrimitives\r
+                            .FindAll((Primitive child) => child.ParentID == mainPrim.LocalID)\r
+                            .ForEach((Primitive subPrim) => UpdatePrimBlocking(subPrim));\r
+                    }\r
                 }\r
 \r
-                List<Avatar> avis = Client.Network.CurrentSim.ObjectsAvatars.FindAll((Avatar a) => true);\r
-                foreach (Avatar avatar in avis)\r
+                if (AvatarRenderingEnabled)\r
                 {\r
-                    UpdatePrimBlocking(avatar);\r
-                    Client.Network.CurrentSim.ObjectsPrimitives\r
-                        .FindAll((Primitive child) => child.ParentID == avatar.LocalID)\r
-                        .ForEach((Primitive attachedPrim) =>\r
-                        {\r
-                            UpdatePrimBlocking(attachedPrim);\r
-                            Client.Network.CurrentSim.ObjectsPrimitives\r
-                                .FindAll((Primitive child) => child.ParentID == attachedPrim.LocalID)\r
-                                .ForEach((Primitive attachedPrimChild) =>\r
-                                {\r
-                                    UpdatePrimBlocking(attachedPrimChild);\r
-                                });\r
-                        });\r
+                    List<Avatar> avis = Client.Network.CurrentSim.ObjectsAvatars.FindAll((Avatar a) => true);\r
+                    foreach (Avatar avatar in avis)\r
+                    {\r
+                        UpdatePrimBlocking(avatar);\r
+                        Client.Network.CurrentSim.ObjectsPrimitives\r
+                            .FindAll((Primitive child) => child.ParentID == avatar.LocalID)\r
+                            .ForEach((Primitive attachedPrim) =>\r
+                            {\r
+                                UpdatePrimBlocking(attachedPrim);\r
+                                Client.Network.CurrentSim.ObjectsPrimitives\r
+                                    .FindAll((Primitive child) => child.ParentID == attachedPrim.LocalID)\r
+                                    .ForEach((Primitive attachedPrimChild) =>\r
+                                    {\r
+                                        UpdatePrimBlocking(attachedPrimChild);\r
+                                    });\r
+                            });\r
+                    }\r
                 }\r
             });\r
         }\r
 \r
         private void frmPrimWorkshop_Shown(object sender, EventArgs e)\r
         {\r
-            GLAvatar.loadlindenmeshes2("avatar_lad.xml");\r
-\r
-            foreach (VisualParamEx vpe in VisualParamEx.morphParams.Values)\r
-            {\r
-                comboBox_morph.Items.Add(vpe.Name);\r
-            }\r
-\r
-            foreach (VisualParamEx vpe in VisualParamEx.drivenParams.Values)\r
-            {\r
-                comboBox_driver.Items.Add(vpe.Name);\r
-            }\r
-            Application.DoEvents();\r
-\r
             SetupGLControl();\r
-            Application.DoEvents();\r
-\r
             LoadCurrentPrims();\r
         }\r
 \r
@@ -970,16 +989,7 @@ namespace Radegast.Rendering
                 }\r
                 else\r
                 {\r
-                    Primitive parentPrim = null;\r
-                    if (p is RenderPrimitive)\r
-                    {\r
-                        parentPrim = ((RenderPrimitive)p).Prim;\r
-                    }\r
-                    else if (p is RenderAvatar)\r
-                    {\r
-                        parentPrim = ((RenderAvatar)p).avatar;\r
-                    }\r
-\r
+                    Primitive parentPrim = p.BasePrim;\r
                     PrimPosAndRot(parentPrim, out parentPos, out parentRot);\r
                     p.SimPosition = parentPos;\r
                     p.SimRotation = parentRot;\r
@@ -1295,6 +1305,8 @@ namespace Radegast.Rendering
 \r
         private void RenderAvatars(RenderPass pass)\r
         {\r
+            if (!AvatarRenderingEnabled) return;\r
+\r
             lock (Avatars)\r
             {\r
                 GL.EnableClientState(ArrayCap.VertexArray);\r
@@ -1709,25 +1721,24 @@ namespace Radegast.Rendering
         }\r
 \r
 \r
-        void RenderBoundingBox(RenderPrimitive prim)\r
+        void RenderBoundingBox(SceneObject prim)\r
         {\r
+            Vector3 scale = prim.BasePrim.Scale;\r
             BoundingVolume bbox = prim.BoundingVolume;\r
             GL.PushAttrib(AttribMask.AllAttribBits);\r
             GL.Disable(EnableCap.Fog);\r
             GL.Disable(EnableCap.Texture2D);\r
-            GL.Disable(EnableCap.Dither);\r
             GL.Disable(EnableCap.Lighting);\r
-            GL.Disable(EnableCap.LineStipple);\r
-            GL.Disable(EnableCap.PolygonStipple);\r
             GL.Disable(EnableCap.CullFace);\r
-            GL.Disable(EnableCap.Blend);\r
             GL.Disable(EnableCap.AlphaTest);\r
+            \r
+            GL.DepthMask(false);\r
+            GL.ColorMask(false, false, false, false);\r
 \r
-            GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);\r
             GL.PushMatrix();\r
             GL.MultMatrix(Math3D.CreateTranslationMatrix(prim.SimPosition));\r
             GL.MultMatrix(Math3D.CreateRotationMatrix(prim.SimRotation));\r
-            GL.Scale(prim.Prim.Scale.X, prim.Prim.Scale.Y, prim.Prim.Scale.Z);\r
+            GL.Scale(scale.X, scale.Y, scale.Z);\r
             GL.Color3(1f, 0f, 0f);\r
             GL.Begin(BeginMode.Quads);\r
             var bmin = bbox.Min;\r
@@ -1771,7 +1782,10 @@ namespace Radegast.Rendering
 \r
             GL.End();\r
             GL.PopMatrix();\r
-            GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);\r
+\r
+            GL.ColorMask(true, true, true, true);\r
+            GL.DepthMask(true);\r
+\r
             GL.PopAttrib();\r
         }\r
 \r
@@ -1779,12 +1793,6 @@ namespace Radegast.Rendering
         {\r
             Primitive prim = mesh.Prim;\r
 \r
-            // Don't render objects too small to matter\r
-            if (LODFactor(mesh.DistanceSquared, prim.Scale, mesh.BoundingVolume.R) < minLODFactor) return;\r
-\r
-            // Don't render objects not in the field of view\r
-            if (!Frustum.ObjectInFrustum(mesh.SimPosition, mesh.BoundingVolume, prim.Scale)) return;\r
-\r
             // Individual prim matrix\r
             GL.PushMatrix();\r
 \r
@@ -1966,13 +1974,7 @@ namespace Radegast.Rendering
             {\r
                 if (!obj.PositionUpdated)\r
                 {\r
-                    Primitive prim = null;\r
-                    if (obj is RenderPrimitive)\r
-                        prim = ((RenderPrimitive)obj).Prim;\r
-                    else if (obj is RenderAvatar)\r
-                        prim = ((RenderAvatar)obj).avatar;\r
-\r
-                    PrimPosAndRot(prim, out obj.SimPosition, out obj.SimRotation);\r
+                    PrimPosAndRot(obj.BasePrim, out obj.SimPosition, out obj.SimRotation);\r
                     obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.SimPosition);\r
                     obj.PositionUpdated = true;\r
                 }\r
@@ -1985,6 +1987,8 @@ namespace Radegast.Rendering
 \r
         private void RenderObjects(RenderPass pass)\r
         {\r
+            if (!PrimitiveRenderingEnabled) return;\r
+\r
             GL.EnableClientState(ArrayCap.VertexArray);\r
             GL.EnableClientState(ArrayCap.TextureCoordArray);\r
             GL.EnableClientState(ArrayCap.NormalArray);\r
@@ -1997,9 +2001,44 @@ namespace Radegast.Rendering
                 for (int i = 0; i < nrPrims; i++)\r
                 {\r
                     //RenderBoundingBox(SortedPrims[i]);\r
+\r
                     if (SortedObjects[i] is RenderPrimitive)\r
                     {\r
-                        RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                        // Don't render objects too small to matter\r
+                        if (LODFactor(SortedObjects[i].DistanceSquared, SortedObjects[i].BasePrim.Scale, SortedObjects[i].BoundingVolume.R) < minLODFactor) continue;\r
+\r
+                        // Don't render objects not in the field of view\r
+                        if (!Frustum.ObjectInFrustum(SortedObjects[i].SimPosition, SortedObjects[i].BoundingVolume, SortedObjects[i].BasePrim.Scale)) continue;\r
+\r
+                        if (!OcclusionCullingEnabled)\r
+                        {\r
+                            RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                        }\r
+                        else\r
+                        {\r
+                            SortedObjects[i].SimpleOccluded = false;\r
+                            if (SortedObjects[i].SimpleQueryID == 0)\r
+                            {\r
+                                GL.GenQueries(1, out SortedObjects[i].SimpleQueryID);\r
+                            }\r
+                            else\r
+                            {\r
+                                int res;\r
+                                GL.GetQueryObject(SortedObjects[i].SimpleQueryID, GetQueryObjectParam.QueryResult, out res);\r
+                                SortedObjects[i].SimpleOccluded = res == 0;\r
+                            }\r
+\r
+                            GL.BeginQuery(QueryTarget.SamplesPassed, SortedObjects[i].SimpleQueryID);\r
+                            if (SortedObjects[i].SimpleOccluded)\r
+                            {\r
+                                RenderBoundingBox(SortedObjects[i]);\r
+                            }\r
+                            else\r
+                            {\r
+                                RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                            }\r
+                            GL.EndQuery(QueryTarget.SamplesPassed);\r
+                        }\r
                     }\r
                 }\r
             }\r
@@ -2009,7 +2048,16 @@ namespace Radegast.Rendering
                 {\r
                     if (SortedObjects[i] is RenderPrimitive)\r
                     {\r
-                        RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                        // Don't render objects too small to matter\r
+                        if (LODFactor(SortedObjects[i].DistanceSquared, SortedObjects[i].BasePrim.Scale, SortedObjects[i].BoundingVolume.R) < minLODFactor) continue;\r
+\r
+                        // Don't render objects not in the field of view\r
+                        if (!Frustum.ObjectInFrustum(SortedObjects[i].SimPosition, SortedObjects[i].BoundingVolume, SortedObjects[i].BasePrim.Scale)) continue;\r
+\r
+                        if (SortedObjects[i] is RenderPrimitive)\r
+                        {\r
+                            RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                        }\r
                     }\r
                 }\r
             }\r
@@ -2312,7 +2360,7 @@ namespace Radegast.Rendering
         {\r
             if (Vector3.Distance(PrimPos(prim), Client.Self.SimPosition) > DrawDistance && !Prims.ContainsKey(prim.ParentID) && !Avatars.ContainsKey(prim.ParentID)) return;\r
 \r
-            if (Client.Network.CurrentSim.ObjectsAvatars.ContainsKey(prim.LocalID))\r
+            if (AvatarRenderingEnabled && Client.Network.CurrentSim.ObjectsAvatars.ContainsKey(prim.LocalID))\r
             {\r
                 AddAvatarToScene(Client.Network.CurrentSim.ObjectsAvatars[prim.LocalID]);\r
                 return;\r
@@ -2320,6 +2368,7 @@ namespace Radegast.Rendering
 \r
             // Skip foliage\r
             if (prim.PrimData.PCode != PCode.Prim) return;\r
+            if (!PrimitiveRenderingEnabled) return;\r
 \r
             if (prim.Textures == null) return;\r
 \r
@@ -2684,6 +2733,10 @@ namespace Radegast.Rendering
 \r
         }\r
 \r
+        private void cbOcclusion_CheckedChanged(object sender, EventArgs e)\r
+        {\r
+            OcclusionCullingEnabled = cbOcclusion.Checked;\r
+        }\r
 \r
 \r
     }\r
index 7f0222d..6188a8c 100644 (file)
@@ -298,6 +298,11 @@ namespace Radegast.Rendering
         public BoundingVolume BoundingVolume;\r
         public bool PositionUpdated;\r
         public SceneObjectType Type = SceneObjectType.None;\r
+        public int SimpleQueryID = 0;\r
+        public int AlphaQueryID = 0;\r
+        public bool SimpleOccluded = false;\r
+        public bool AlphaOccluded = false;\r
+        public virtual Primitive BasePrim { get; set; }\r
 \r
         public virtual int CompareTo(object other)\r
         {\r
@@ -325,6 +330,12 @@ namespace Radegast.Rendering
         {\r
         }\r
 \r
+        public override Primitive BasePrim\r
+        {\r
+            get { return Prim; }\r
+            set { Prim = value; }\r
+        }\r
+\r
         public override string ToString()\r
         {\r
             uint id = Prim == null ? 0 : Prim.LocalID;\r
@@ -1540,13 +1551,19 @@ namespace Radegast.Rendering
         }\r
     }\r
 \r
-    class RenderAvatar : SceneObject\r
+    public class RenderAvatar : SceneObject\r
     {\r
         public RenderAvatar()\r
         {\r
             Type = SceneObjectType.Avatar;\r
         }\r
 \r
+        public override Primitive BasePrim\r
+        {\r
+            get { return avatar; }\r
+            set { if (value is Avatar) avatar = (Avatar)value; }\r
+        }\r
+\r
         public GLAvatar glavatar = new GLAvatar();\r
         public Avatar avatar;\r
         public FaceData[] data = new FaceData[32];\r