OSDN Git Service

* Added simple LOD factor calculation (many thanks to Moon Metty)
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 4 Jul 2011 04:22:05 +0000 (04:22 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 4 Jul 2011 04:22:05 +0000 (04:22 +0000)
* Disable "3D Scene" button when we are not connected

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

Radegast/GUI/Dialogs/MainForm.Designer.cs
Radegast/GUI/Dialogs/MainForm.cs
Radegast/GUI/Rendering/Rendering.Designer.cs
Radegast/GUI/Rendering/Rendering.cs

index a6dbc61..3bc8e71 100644 (file)
@@ -608,6 +608,7 @@ namespace Radegast
             // tsb3D
             // 
             this.tsb3D.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+            this.tsb3D.Enabled = false;
             this.tsb3D.Image = ((System.Drawing.Image)(resources.GetObject("tsb3D.Image")));
             this.tsb3D.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.tsb3D.Name = "tsb3D";
index f9de787..3b876fb 100644 (file)
@@ -338,7 +338,7 @@ namespace Radegast
             else if (e.Status == LoginStatus.Success)
             {
                 InAutoReconnect = false;
-                tbtnVoice.Enabled = disconnectToolStripMenuItem.Enabled =
+                tsb3D.Enabled =  tbtnVoice.Enabled = disconnectToolStripMenuItem.Enabled =
                 tbtnGroups.Enabled = tbnObjects.Enabled = tbtnWorld.Enabled = tbnTools.Enabled = tmnuImport.Enabled =
                     tbtnFriends.Enabled = tbtnInventory.Enabled = tbtnSearch.Enabled = tbtnMap.Enabled = true;
 
@@ -349,7 +349,7 @@ namespace Radegast
 
         private void netcom_ClientLoggedOut(object sender, EventArgs e)
         {
-            tbtnVoice.Enabled = disconnectToolStripMenuItem.Enabled =
+            tsb3D.Enabled = tbtnVoice.Enabled = disconnectToolStripMenuItem.Enabled =
             tbtnGroups.Enabled = tbnObjects.Enabled = tbtnWorld.Enabled = tbnTools.Enabled = tmnuImport.Enabled =
                 tbtnFriends.Enabled = tbtnInventory.Enabled = tbtnSearch.Enabled = tbtnMap.Enabled = false;
 
index 878976e..5c40e37 100644 (file)
@@ -61,6 +61,7 @@ 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.hsLOD = new System.Windows.Forms.HScrollBar();\r
             this.hsSpecular = new System.Windows.Forms.HScrollBar();\r
             this.hsDiffuse = new System.Windows.Forms.HScrollBar();\r
             this.hsAmbient = new System.Windows.Forms.HScrollBar();\r
@@ -81,6 +82,7 @@ namespace Radegast.Rendering
             // \r
             // gbZoom\r
             // \r
+            this.gbZoom.Controls.Add(this.hsLOD);\r
             this.gbZoom.Controls.Add(this.hsSpecular);\r
             this.gbZoom.Controls.Add(this.hsDiffuse);\r
             this.gbZoom.Controls.Add(this.hsAmbient);\r
@@ -89,12 +91,21 @@ namespace Radegast.Rendering
             this.gbZoom.Controls.Add(this.cbAA);\r
             this.gbZoom.Controls.Add(this.chkWireFrame);\r
             this.gbZoom.Dock = System.Windows.Forms.DockStyle.Bottom;\r
-            this.gbZoom.Location = new System.Drawing.Point(0, 516);\r
+            this.gbZoom.Location = new System.Drawing.Point(0, 507);\r
             this.gbZoom.Name = "gbZoom";\r
-            this.gbZoom.Size = new System.Drawing.Size(644, 89);\r
+            this.gbZoom.Size = new System.Drawing.Size(644, 98);\r
             this.gbZoom.TabIndex = 8;\r
             this.gbZoom.TabStop = false;\r
             // \r
+            // hsLOD\r
+            // \r
+            this.hsLOD.Location = new System.Drawing.Point(343, 67);\r
+            this.hsLOD.Name = "hsLOD";\r
+            this.hsLOD.Size = new System.Drawing.Size(292, 17);\r
+            this.hsLOD.TabIndex = 24;\r
+            this.hsLOD.Value = 25;\r
+            this.hsLOD.Scroll += new System.Windows.Forms.ScrollEventHandler(this.hsLOD_Scroll);\r
+            // \r
             // hsSpecular\r
             // \r
             this.hsSpecular.Location = new System.Drawing.Point(343, 50);\r
@@ -249,6 +260,7 @@ namespace Radegast.Rendering
         private System.Windows.Forms.HScrollBar hsSpecular;\r
         private System.Windows.Forms.HScrollBar hsDiffuse;\r
         private System.Windows.Forms.HScrollBar hsAmbient;\r
+        private System.Windows.Forms.HScrollBar hsLOD;\r
 \r
     }\r
 }\r
index 3b126c3..519bbad 100644 (file)
@@ -108,6 +108,7 @@ namespace Radegast.Rendering
         System.Diagnostics.Stopwatch renderTimer;\r
         double lastFrameTime = 0d;\r
         double advTimerTick = 0d;\r
+        float minLODFactor = 0.005f;\r
 \r
         float[] lightPos = new float[] { 128f, 128f, 5000f, 0f };\r
         float ambient = 0.26f;\r
@@ -1329,6 +1330,15 @@ namespace Radegast.Rendering
             GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 0f);\r
         }\r
 \r
+        float LODFactor(Vector3 pos, Vector3 primScale, float radius)\r
+        {\r
+            float distance = Vector3.Distance(Camera.Position, pos);\r
+            float scale = primScale.X;\r
+            if (primScale.Y > scale) scale = primScale.Y;\r
+            if (primScale.Z > scale) scale = primScale.Z;\r
+            return scale * radius * radius / distance;\r
+        }\r
+\r
         private void RenderObjects(RenderPass pass)\r
         {\r
             lock (Prims)\r
@@ -1397,6 +1407,11 @@ namespace Radegast.Rendering
                         Primitive.TextureEntryFace teFace = mesh.Prim.Textures.FaceTextures[j];\r
                         Face face = mesh.Faces[j];\r
                         FaceData data = (FaceData)face.UserData;\r
+\r
+                        // Don't render objects too small to matter\r
+                        if (LODFactor(primPos, prim.Scale, data.BoundingSphere.R) < minLODFactor) continue;\r
+\r
+                        // Don't render objects not in the field of view\r
                         if (!Frustum.ObjectInFrustum(primPos, data.BoundingSphere, prim.Scale)) continue;\r
 \r
                         if (teFace == null)\r
@@ -2034,5 +2049,10 @@ namespace Radegast.Rendering
             specular = (float)hsSpecular.Value / 100f;\r
             SetSun();\r
         }\r
+\r
+        private void hsLOD_Scroll(object sender, ScrollEventArgs e)\r
+        {\r
+            minLODFactor = (float)hsLOD.Value / 5000f;\r
+        }\r
     }\r
 }\r