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
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
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
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
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
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
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
}\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
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
\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
}\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
\r
private void RenderAvatars(RenderPass pass)\r
{\r
+ if (!AvatarRenderingEnabled) return;\r
+\r
lock (Avatars)\r
{\r
GL.EnableClientState(ArrayCap.VertexArray);\r
}\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
\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
{\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
{\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
\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
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
{\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
{\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
\r
// Skip foliage\r
if (prim.PrimData.PCode != PCode.Prim) return;\r
+ if (!PrimitiveRenderingEnabled) return;\r
\r
if (prim.Textures == null) return;\r
\r
\r
}\r
\r
+ private void cbOcclusion_CheckedChanged(object sender, EventArgs e)\r
+ {\r
+ OcclusionCullingEnabled = cbOcclusion.Checked;\r
+ }\r
\r
\r
}\r