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