Annotation of /trunk/DefaultRenderer/DefaultRenderer.cs
Parent Directory
|
Revision Log
Revision 29 - (view) (download)
| 1 : | albert | 4 | using System; |
| 2 : | using System.Collections.Generic; | ||
| 3 : | using System.Windows; | ||
| 4 : | using System.Windows.Controls; | ||
| 5 : | using System.Windows.Media; | ||
| 6 : | using System.Windows.Media.Media3D; | ||
| 7 : | using System.Windows.Threading; | ||
| 8 : | using OpenMetaverse; | ||
| 9 : | using OpenMetaverse.Rendering; | ||
| 10 : | using Xenki.Framework; | ||
| 11 : | using Quaternion=System.Windows.Media.Media3D.Quaternion; | ||
| 12 : | |||
| 13 : | namespace Xenki.DefaultRenderer | ||
| 14 : | { | ||
| 15 : | class DefaultRenderer : IRenderer | ||
| 16 : | { | ||
| 17 : | private readonly Viewport3D m_viewport; | ||
| 18 : | private readonly PerspectiveCamera m_camera; | ||
| 19 : | albert | 15 | private CameraControl m_cameracontrol; |
| 20 : | albert | 4 | private IRendering m_mesher; |
| 21 : | private bool Broken; | ||
| 22 : | |||
| 23 : | private readonly Point3D[,] m_heightmapPoints = new Point3D[256,256]; | ||
| 24 : | private double[,] m_heightmap = new double[256,256]; | ||
| 25 : | private ModelVisual3D m_terrain; | ||
| 26 : | |||
| 27 : | private readonly Dictionary<uint, Visual3D> m_models = new Dictionary<uint, Visual3D>(); | ||
| 28 : | private readonly Dictionary<uint, Vector3> m_parentPositions = new Dictionary<uint, Vector3>(); | ||
| 29 : | |||
| 30 : | private readonly Material m_defaultMaterial; | ||
| 31 : | private readonly DiffuseMaterial m_terrainMaterial; | ||
| 32 : | |||
| 33 : | public DefaultRenderer(Viewport3D m_viewport) | ||
| 34 : | { | ||
| 35 : | // Viewport | ||
| 36 : | this.m_viewport = m_viewport; | ||
| 37 : | albert | 14 | // m_viewport.ClipToBounds = false; |
| 38 : | albert | 4 | m_viewport.IsHitTestVisible = true; |
| 39 : | |||
| 40 : | // Camera Issues | ||
| 41 : | Point3D CameraPos = new Point3D(0,0,50); | ||
| 42 : | Point3D CameraLook = new Point3D(128,128,10); | ||
| 43 : | |||
| 44 : | m_camera = new PerspectiveCamera(new Point3D(0, 0, 0), new Vector3D(0, 0, 0), | ||
| 45 : | new Vector3D(0, 0, 1), 90); | ||
| 46 : | |||
| 47 : | m_camera.Position = CameraPos; | ||
| 48 : | m_camera.LookDirection = new Vector3D(CameraLook.X - m_camera.Position.X, CameraLook.Y - m_camera.Position.Y, CameraLook.Z - m_camera.Position.Z); | ||
| 49 : | |||
| 50 : | m_camera.FarPlaneDistance = 1024; | ||
| 51 : | m_camera.NearPlaneDistance = 0.01; | ||
| 52 : | m_viewport.Camera = m_camera; | ||
| 53 : | |||
| 54 : | albert | 26 | // Setup Camera Control |
| 55 : | albert | 15 | m_cameracontrol = new CameraControl(m_camera); |
| 56 : | albert | 29 | // m_camera.Transform = m_cameracontrol.Transform; |
| 57 : | albert | 15 | m_cameracontrol.EventSource = m_viewport; |
| 58 : | albert | 4 | |
| 59 : | albert | 8 | |
| 60 : | albert | 4 | // Default Material Properties |
| 61 : | m_defaultMaterial = new DiffuseMaterial( | ||
| 62 : | new SolidColorBrush(Colors.DarkKhaki)); | ||
| 63 : | |||
| 64 : | GradientBrush terGrad = new RadialGradientBrush(Colors.ForestGreen, Colors.SandyBrown); | ||
| 65 : | m_terrainMaterial = new DiffuseMaterial( | ||
| 66 : | terGrad); | ||
| 67 : | |||
| 68 : | |||
| 69 : | // Scene Lighting | ||
| 70 : | ModelVisual3D lights = new ModelVisual3D(); | ||
| 71 : | lights.Content = new DirectionalLight(Colors.White, new Vector3D(-20, -30, -10)); | ||
| 72 : | |||
| 73 : | ModelVisual3D point = new ModelVisual3D(); | ||
| 74 : | PointLight pointLight = new PointLight(Colors.WhiteSmoke, new Point3D(128, 128, 80)); | ||
| 75 : | point.Content = pointLight; | ||
| 76 : | |||
| 77 : | ModelVisual3D ambient = new ModelVisual3D(); | ||
| 78 : | AmbientLight ambientLight = new AmbientLight(Color.FromArgb(0xFF, 0x40, 0x40, 0x40)); | ||
| 79 : | ambient.Content = ambientLight; | ||
| 80 : | |||
| 81 : | m_viewport.Children.Add(lights); | ||
| 82 : | m_viewport.Children.Add(point); | ||
| 83 : | m_viewport.Children.Add(ambient); | ||
| 84 : | albert | 9 | |
| 85 : | |||
| 86 : | albert | 4 | // Terrain Base |
| 87 : | for(int x=0;x<256;x++) | ||
| 88 : | { | ||
| 89 : | for(int y=0;y<256;y++) | ||
| 90 : | { | ||
| 91 : | m_heightmap[x, y] = 30.0; | ||
| 92 : | } | ||
| 93 : | } | ||
| 94 : | |||
| 95 : | m_terrain = CreateTerrain(m_heightmap); | ||
| 96 : | m_viewport.Children.Add(m_terrain); | ||
| 97 : | |||
| 98 : | // Water Plane | ||
| 99 : | SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(128, 0, 128, 255)); | ||
| 100 : | DiffuseMaterial material = new DiffuseMaterial(brush); | ||
| 101 : | |||
| 102 : | //m_viewport.Children.Add(DefaultUtil.CreateCube(new Point3D(0,0,0), new Point3D(256,256,20), | ||
| 103 : | // material)); | ||
| 104 : | |||
| 105 : | } | ||
| 106 : | albert | 9 | |
| 107 : | albert | 4 | public IRendering Mesher |
| 108 : | { | ||
| 109 : | set { m_mesher = value; } | ||
| 110 : | } | ||
| 111 : | |||
| 112 : | public void AddPrimitive(uint id, Primitive data) | ||
| 113 : | { | ||
| 114 : | lock(m_parentPositions) | ||
| 115 : | { | ||
| 116 : | m_parentPositions[id] = data.Position; | ||
| 117 : | } | ||
| 118 : | |||
| 119 : | if(Broken) | ||
| 120 : | return; | ||
| 121 : | |||
| 122 : | m_viewport.Dispatcher.Invoke( | ||
| 123 : | DispatcherPriority.Normal, | ||
| 124 : | new System.Windows.Forms.MethodInvoker | ||
| 125 : | (delegate | ||
| 126 : | { | ||
| 127 : | lock (m_models) | ||
| 128 : | { | ||
| 129 : | try | ||
| 130 : | { | ||
| 131 : | if (m_models.ContainsKey(id)) | ||
| 132 : | { | ||
| 133 : | m_viewport.Children.Remove(m_models[id]); | ||
| 134 : | m_models.Remove(id); | ||
| 135 : | } | ||
| 136 : | |||
| 137 : | lock(m_parentPositions) | ||
| 138 : | { | ||
| 139 : | if(m_parentPositions.ContainsKey(data.ParentID)) | ||
| 140 : | { | ||
| 141 : | data.Position += m_parentPositions[data.ParentID]; | ||
| 142 : | } | ||
| 143 : | } | ||
| 144 : | |||
| 145 : | // Add it to the scene appropriately. | ||
| 146 : | ModelVisual3D model = CreateModel(data); | ||
| 147 : | m_models.Add(id, model); | ||
| 148 : | m_viewport.Children.Add(model); | ||
| 149 : | } | ||
| 150 : | catch (Exception e) | ||
| 151 : | { | ||
| 152 : | MessageBox.Show(e.ToString()); | ||
| 153 : | Broken = true; | ||
| 154 : | } | ||
| 155 : | } | ||
| 156 : | } | ||
| 157 : | ) | ||
| 158 : | ); | ||
| 159 : | } | ||
| 160 : | |||
| 161 : | private ModelVisual3D CreateTerrain(double[,] map) | ||
| 162 : | { | ||
| 163 : | MeshGeometry3D mesh = new MeshGeometry3D(); | ||
| 164 : | |||
| 165 : | for (int y = 0; y < 256; y++) | ||
| 166 : | { | ||
| 167 : | for (int x = 0; x < 256; x++) | ||
| 168 : | { | ||
| 169 : | m_heightmapPoints[y, x] = new Point3D(x, y, map[x, y]); | ||
| 170 : | mesh.Positions.Add(m_heightmapPoints[y, x]); | ||
| 171 : | |||
| 172 : | mesh.TextureCoordinates.Add(new Point(x/255.0, y/255.0)); | ||
| 173 : | } | ||
| 174 : | } | ||
| 175 : | |||
| 176 : | for(int x=0;x<255;x++) | ||
| 177 : | { | ||
| 178 : | for(int y=0;y<255;y++) | ||
| 179 : | { | ||
| 180 : | int p0 = (x*256) + y; | ||
| 181 : | int p1 = (x*256) + (y + 1); | ||
| 182 : | int p2 = ((x + 1)*256) + y; | ||
| 183 : | int p3 = ((x + 1)*256) + (y + 1); | ||
| 184 : | |||
| 185 : | |||
| 186 : | // Δ 013 |\ | ||
| 187 : | mesh.TriangleIndices.Add(p1); //#0 | ||
| 188 : | |||
| 189 : | mesh.TriangleIndices.Add(p3); //#1 | ||
| 190 : | |||
| 191 : | mesh.TriangleIndices.Add(p2); //#3 | ||
| 192 : | |||
| 193 : | |||
| 194 : | // Δ 023 | ||
| 195 : | mesh.TriangleIndices.Add(p0); //#0 | ||
| 196 : | |||
| 197 : | mesh.TriangleIndices.Add(p1); //#2 | ||
| 198 : | |||
| 199 : | mesh.TriangleIndices.Add(p2); //#3 | ||
| 200 : | |||
| 201 : | |||
| 202 : | |||
| 203 : | } | ||
| 204 : | } | ||
| 205 : | |||
| 206 : | GeometryModel3D triangleModel = new GeometryModel3D( | ||
| 207 : | mesh, m_terrainMaterial); | ||
| 208 : | |||
| 209 : | ModelVisual3D model = new ModelVisual3D(); | ||
| 210 : | model.Content = triangleModel; | ||
| 211 : | |||
| 212 : | return model; | ||
| 213 : | } | ||
| 214 : | |||
| 215 : | private ModelVisual3D CreateModel(Primitive data) | ||
| 216 : | { | ||
| 217 : | MeshGeometry3D mesh = new MeshGeometry3D(); | ||
| 218 : | SimpleMesh basic = m_mesher.GenerateSimpleMesh(data, DetailLevel.Medium); | ||
| 219 : | |||
| 220 : | // Translation | ||
| 221 : | TranslateTransform3D tt = new TranslateTransform3D( | ||
| 222 : | new Vector3D(data.Position.X, data.Position.Y, data.Position.Z) | ||
| 223 : | ); | ||
| 224 : | |||
| 225 : | Quaternion rot = new Quaternion(data.Rotation.X, data.Rotation.Y, data.Rotation.Z, data.Rotation.W); | ||
| 226 : | |||
| 227 : | RotateTransform3D rt = new RotateTransform3D( | ||
| 228 : | new AxisAngleRotation3D(rot.Axis, rot.Angle) | ||
| 229 : | ); | ||
| 230 : | |||
| 231 : | // Scale | ||
| 232 : | ScaleTransform3D st = new ScaleTransform3D( | ||
| 233 : | new Vector3D(data.Scale.X, data.Scale.Y, data.Scale.Z)); | ||
| 234 : | |||
| 235 : | foreach (Vertex v in basic.Vertices) | ||
| 236 : | { | ||
| 237 : | Point3D d = new Point3D( | ||
| 238 : | v.Position.X, | ||
| 239 : | v.Position.Y, | ||
| 240 : | v.Position.Z); | ||
| 241 : | |||
| 242 : | // Scale | ||
| 243 : | d = st.Transform(d); | ||
| 244 : | // Rotate | ||
| 245 : | d = rt.Transform(d); | ||
| 246 : | // Move | ||
| 247 : | d = tt.Transform(d); | ||
| 248 : | |||
| 249 : | albert | 15 | mesh.Positions.Add(d); |
| 250 : | albert | 4 | // These normals dont appear to be working for some reason, |
| 251 : | // however the auto-generated normals appear adequate for now. | ||
| 252 : | albert | 10 | // mesh.Normals.Add(new Vector3D(v.Normal.X, v.Normal.Y, v.Normal.Z)); |
| 253 : | albert | 4 | mesh.TextureCoordinates.Add(new Point(v.TexCoord.X, v.TexCoord.Y)); |
| 254 : | } | ||
| 255 : | |||
| 256 : | foreach (ushort ind in basic.Indices) | ||
| 257 : | { | ||
| 258 : | mesh.TriangleIndices.Add(ind); | ||
| 259 : | } | ||
| 260 : | |||
| 261 : | GeometryModel3D triangleModel; | ||
| 262 : | |||
| 263 : | |||
| 264 : | Color[] colAry = new Color[5]; | ||
| 265 : | colAry[0] = Colors.Violet; | ||
| 266 : | colAry[1] = Colors.BlueViolet; | ||
| 267 : | colAry[2] = Colors.Navy; | ||
| 268 : | colAry[3] = Colors.CornflowerBlue; | ||
| 269 : | colAry[4] = Colors.PowderBlue; | ||
| 270 : | Random x = new Random(); | ||
| 271 : | Color col = colAry[x.Next(0, 5)]; | ||
| 272 : | |||
| 273 : | afrisby | 25 | if (data.Textures != null && |
| 274 : | data.Textures.FaceTextures != null && | ||
| 275 : | data.Textures.FaceTextures.Length > 0) | ||
| 276 : | { | ||
| 277 : | col = Color.FromScRgb(data.Textures.DefaultTexture.RGBA.A, | ||
| 278 : | data.Textures.DefaultTexture.RGBA.R, | ||
| 279 : | data.Textures.DefaultTexture.RGBA.G, | ||
| 280 : | data.Textures.DefaultTexture.RGBA.B); | ||
| 281 : | } | ||
| 282 : | |||
| 283 : | albert | 4 | triangleModel = new GeometryModel3D( |
| 284 : | mesh, new DiffuseMaterial(new SolidColorBrush(col))); | ||
| 285 : | albert | 10 | |
| 286 : | albert | 4 | //*/ |
| 287 : | /* | ||
| 288 : | GradientBrush Grad = new LinearGradientBrush(Colors.Red, Colors.Blue, 90); | ||
| 289 : | Material mat = new DiffuseMaterial(Grad); | ||
| 290 : | |||
| 291 : | triangleModel = new GeometryModel3D( | ||
| 292 : | mesh, mat); | ||
| 293 : | */ | ||
| 294 : | ModelVisual3D model = new ModelVisual3D(); | ||
| 295 : | model.Content = triangleModel; | ||
| 296 : | albert | 17 | |
| 297 : | |||
| 298 : | albert | 28 | //Transform3DGroup clickedtransformGroup = new Transform3DGroup(); |
| 299 : | //clickedtransformGroup.Children.Add(new RotateTransform3D()); | ||
| 300 : | //clickedtransformGroup.Children.Add( new TranslateTransform3D(0,0,0)); | ||
| 301 : | albert | 17 | |
| 302 : | albert | 28 | MatrixTransform3D matrixTransform = new MatrixTransform3D(); |
| 303 : | |||
| 304 : | model.Transform = matrixTransform;// clickedtransformGroup; | ||
| 305 : | albert | 4 | return model; |
| 306 : | } | ||
| 307 : | |||
| 308 : | public void RemovePrimitive(uint id) | ||
| 309 : | { | ||
| 310 : | m_viewport.Dispatcher.Invoke( | ||
| 311 : | DispatcherPriority.Normal, | ||
| 312 : | new System.Windows.Forms.MethodInvoker | ||
| 313 : | (delegate | ||
| 314 : | { | ||
| 315 : | if(m_models.ContainsKey(id)) | ||
| 316 : | { | ||
| 317 : | // Remove from scene and models list | ||
| 318 : | m_viewport.Children.Remove(m_models[id]); | ||
| 319 : | m_models.Remove(id); | ||
| 320 : | } | ||
| 321 : | } | ||
| 322 : | ) | ||
| 323 : | ); | ||
| 324 : | } | ||
| 325 : | |||
| 326 : | public void SetTerrain(int x, int y, double val) | ||
| 327 : | { | ||
| 328 : | m_heightmap[x, y] = val; | ||
| 329 : | } | ||
| 330 : | |||
| 331 : | public void SetTerrain(double[,] map) | ||
| 332 : | { | ||
| 333 : | m_heightmap = map; | ||
| 334 : | |||
| 335 : | m_viewport.Dispatcher.Invoke( | ||
| 336 : | DispatcherPriority.Normal, | ||
| 337 : | new System.Windows.Forms.MethodInvoker | ||
| 338 : | (delegate | ||
| 339 : | { | ||
| 340 : | m_viewport.Children.Remove(m_terrain); | ||
| 341 : | m_terrain = CreateTerrain(map); | ||
| 342 : | m_viewport.Children.Add(m_terrain); | ||
| 343 : | } | ||
| 344 : | ) | ||
| 345 : | ); | ||
| 346 : | } | ||
| 347 : | } | ||
| 348 : | } |
| ViewVC Help | |
| Powered by ViewVC 1.0.0 |

