public WaterSceneNode(SceneNode parent, SceneManager mgr, Dimension2Df tileSize, Dimension2D tileCount, Dimension2D precision, int id) : base(parent, mgr, id) { _scene = mgr; _driver = mgr.VideoDriver; AnimatedMesh wmesh = _scene.AddHillPlaneMesh("watermesh" + _current, tileSize, tileCount, 0, new Dimension2Df(0, 0), new Dimension2Df(1, 1)); _current++; int dmat = (int)MaterialType.Reflection2Layer; if(_driver.DriverType == DriverType.OpenGL) dmat = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( WATER_VERTEX_GLSL, "main", VertexShaderType._1_1, WATER_FRAGMENT_GLSL, "main", PixelShaderType._1_1, OnShaderSet, MaterialType.TransparentAlphaChannel, 0); else dmat = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( WATER_HLSL, "vertexMain", VertexShaderType._2_0, WATER_HLSL, "pixelMain", PixelShaderType._2_0, OnShaderSet, MaterialType.TransparentAlphaChannel, 2); if (_driver.DriverType == DriverType.OpenGL) ClampShader = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( CLAMP_VERTEX_GLSL, "main", VertexShaderType._1_1, CLAMP_FRAGMENT_GLSL, "main", PixelShaderType._1_1, OnShaderSet, MaterialType.TransparentAlphaChannel, 1); else ClampShader = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( CLAMP_HLSL, "vertexMain", VertexShaderType._2_0, CLAMP_HLSL, "pixelMain", PixelShaderType._2_0, OnShaderSet, MaterialType.TransparentAlphaChannel, 3); _waternode = _scene.AddMeshSceneNode(wmesh.GetMesh(0), this, -1); _waternode.SetMaterialType(dmat); _waternode.SetMaterialFlag(MaterialFlag.BackFaceCulling, false); _waternode.SetMaterialFlag(MaterialFlag.Lighting, false); _waternode.SetMaterialFlag(MaterialFlag.FogEnable, false); _rt = _driver.CreateRenderTargetTexture(precision); _waternode.SetMaterialTexture(0, _rt); CameraSceneNode oldcam = _scene.ActiveCamera; _fixedcam = _scene.AddCameraSceneNode(null); if(oldcam != null) _scene.ActiveCamera = oldcam; }
public WaterSceneNode(SceneNode parent, SceneManager mgr, Dimension2Df tileSize, Dimension2D tileCount, Dimension2D precision) : this(parent, mgr, tileSize, tileCount, precision, -1) { }
public WaterSceneNode(SceneNode parent, SceneManager mgr, Dimension2Df tileSize, Dimension2D tileCount) : this(parent, mgr, tileSize, tileCount, new Dimension2D(256, 256), -1) { }
public TextSceneNode AddBillboardTextSceneNodeW(GUIFont font, string text, SceneNode parent, Dimension2Df size, Vector3D position, int id, Color shade_top, Color shade_down) { IntPtr par = IntPtr.Zero; if (parent != null) par = parent.Raw; return (TextSceneNode) NativeElement.GetObject(SceneManager_AddTextSceneNode2W(_raw, font.Raw, text, par, size.ToUnmanaged(), position.ToUnmanaged(), id, shade_top.ToUnmanaged(), shade_down.ToUnmanaged()), typeof(TextSceneNode)); }
/// <summary> /// This function add avatar name to target node. /// </summary> /// <param name="_parentNode">target node</param> /// <param name="_name"></param> /// <param name="_frame"></param> /// <param name="_type"></param> /// <returns></returns> public SceneNode AddNameSceneNode(SceneNode _parentNode, string _first, string _last, bool _frame, AvatarNameType _type) { if (_type == AvatarNameType.None) return null; SceneNode node = Reference.SceneManager.AddEmptySceneNode(_parentNode, -1); node.Position = new Vector3D(0, 1.9f, 0); string name = _first + " " + _last; Dimension2Df size = new Dimension2Df(0.4f, 0.1f); switch (_type) { case AvatarNameType.FirstAndLast: // default break; case AvatarNameType.First: name = _first; size = new Dimension2Df(0.2f, 0.1f); break; case AvatarNameType.Last: name = _last; size = new Dimension2Df(0.2f, 0.1f); break; } #if BILLBOARD_NAME TextSceneNode textNode = Reference.SceneManager.AddBillboardTextSceneNodeW(Reference.GUIEnvironment.BuiltInFont, name, node, size, new Vector3D(), -1, Color.White, Color.White); #else TextSceneNode textNode = Reference.SceneManager.AddTextSceneNode(Reference.GUIEnvironment.Skin.Font, name, Color.White, node); #endif // If _frame is true, set font shadow. if (_frame) { #if BILLBOARD_NAME #else textNode = Reference.SceneManager.AddTextSceneNode(Reference.GUIEnvironment.Skin.Font, name, Color.Black, node); #endif } return node; }
/// <summary> /// Creates a hill plane mesh (used for instance for any water) /// </summary> /// <returns>The mesh</returns> /// <param name="name">Name of this mesh</param> /// <param name="tileSize">Size of each tile from the mesh</param> /// <param name="tileCount">Number of tiles</param> /// <param name="hillHeight">Height of each hills</param> /// <param name="countHills">Number of hills</param> /// <param name="textureRepeatCount">Texture repeatition count</param> public AnimatedMesh AddHillPlaneMesh(string name, Dimension2Df tileSize, Dimension2D tileCount, float hillHeight, Dimension2Df countHills, Dimension2Df textureRepeatCount) { return (AnimatedMesh) NativeElement.GetObject(SceneManager_AddHillPlaneMesh(_raw, name, tileSize.ToUnmanaged(), tileCount.ToUnmanaged(), hillHeight, countHills.ToUnmanaged(), textureRepeatCount.ToUnmanaged()), typeof(AnimatedMesh)); }
/// <summary> /// Adds a billboard (simple 2D texture which seems to be on a 3D box) /// </summary> /// <returns>The billboard</returns> /// <param name="parent">Parents from the node</param> /// <param name="size">Size of the billboard</param> /// <param name="id">ID (-1 for automatic ID assignation)</param> public BillboardSceneNode AddBillboardSceneNode(SceneNode parent, Dimension2Df size, int id) { IntPtr par = IntPtr.Zero; if(parent != null) par = parent.Raw; return (BillboardSceneNode) NativeElement.GetObject(SceneManager_AddBillboardSceneNode(_raw, par, size.ToUnmanaged(), id), typeof(BillboardSceneNode)); }
bool Create(bool save) { Random rand = new Random((int)((100 * gridpos.X) + gridpos.Z)); int count = rand.Next(3000, 3200); _bbox = new Box3D(); Particles = new GrassParticle[count]; /*Matrix4 m = new Matrix4(); m.RotationDegrees = Terrain.Rotation; m.Translation = Terrain.AbsolutePosition; m.MakeInverse();*/ Color[,] TGMRetrieve = TerrainGrassMap.Retrieve(); Color[,] TCMRetrieve = TerrainColourMap.Retrieve(); Color[,] THMRetrieve = TerrainHeightMap.Retrieve(); System.Collections.ArrayList tosave = new System.Collections.ArrayList(); for (int i = 0; i < count; i++) { Particles[i].points = new Vector3D[4]; float x = rand.Next(0, GRASS_PATCH_SIZE * 10) / 10f; float z = rand.Next(0, GRASS_PATCH_SIZE * 10) / 10f; x -= GRASS_PATCH_SIZE / 2f; z -= GRASS_PATCH_SIZE / 2f; Particles[i].pos.X = x; Particles[i].pos.Z = z; Particles[i].flex = rand.Next(0, 100) / 100f; Particles[i].sprite.Width = rand.Next(0, _imagecount.Width); if (i < 30) Particles[i].sprite.Height = rand.Next(0, _imagecount.Height); else Particles[i].sprite.Height = 0; Vector3D p = Position + Particles[i].pos; Dimension2Df size; Vector3D xz = new Vector3D(p.X / Terrain.Scale.X, 0f, p.Z / Terrain.Scale.Z); int x1 = (int)Math.Floor(xz.X); int z1 = (int)Math.Floor(xz.Z); float height; if (x1 < 1 || z1 < 1 || x1 > TerrainHeightMap.OriginalSize.Width - 1 || z1 > TerrainHeightMap.OriginalSize.Height - 1) continue; Color cDensity = TGMRetrieve[x1, z1]; if (rand.Next(0, 255) > cDensity.A || cDensity.A < 1) continue; float ay = THMRetrieve[x1, z1].B * Terrain.Scale.Y; float by = THMRetrieve[x1 + 1, z1].B * Terrain.Scale.Y; float cy = THMRetrieve[x1, z1 + 1].B * Terrain.Scale.Y; float dy = THMRetrieve[x1 + 1, z1 + 1].B * Terrain.Scale.Y; float u1 = xz.X - x1; float v1 = xz.Z - z1; height = ay * (1.0f - u1) * (1.0f - v1) + by * u1 * (1.0f - v1) + cy * (1.0f - u1) * v1 + dy * u1 * v1; size = new Dimension2Df(rand.Next(40, 70), 100); size.Height *= (float)cDensity.B / 200f; Particles[i].pos.Y = height + (size.Height * 0.5f); Particles[i].color = TCMRetrieve[x1, z1]; Particles[i].startColor = TCMRetrieve[x1, z1]; _bbox.AddInternalPoint(Particles[i].pos); Vector3D dimensions = new Vector3D(0.5f * size.Width, -0.5f * size.Height, 0); /*float rotation = rand.Next(0, 3600) / 10f; Matrix4 m2 = new Matrix4(); m2.RotationDegrees = new Vector3D(0, rotation, 0); m2.RotateVect(dimensions);*/ //Vector3D h = new Vector3D(dimensions.X,0.0f,dimensions.Z); //Vector3D v = new Vector3D(0.0f,dimensions.Y,0.0f); Particles[i].points[0] = Particles[i].pos + new Vector3D(dimensions.X, dimensions.Y, dimensions.Z); Particles[i].points[1] = Particles[i].pos + new Vector3D(dimensions.X, -dimensions.Y, dimensions.Z); Particles[i].points[2] = Particles[i].pos - new Vector3D(dimensions.X, dimensions.Y, dimensions.Z); Particles[i].points[3] = Particles[i].pos - new Vector3D(dimensions.X, -dimensions.Y, dimensions.Z); tosave.Add(Particles[i]); } Particles = (GrassParticle[])tosave.ToArray(typeof(GrassParticle)); tosave.Clear(); if (save) return Save(); return true; }
public override int Load() { if (WaterSceneNode == null) { const string filename = "advanced_sea_shader.fx"; Timer = Reference.Device.Timer; Size = new Dimension2Df(256, 256); if (Reference.SceneManager.ActiveCamera != null) { CameraSceneNode currentCamera = Reference.SceneManager.ActiveCamera; Camera = Reference.SceneManager.AddCameraSceneNode(parentNode); Camera.FarValue = currentCamera.FarValue; Camera.FOV = currentCamera.FOV; Reference.SceneManager.ActiveCamera = currentCamera; } else { Camera = Reference.SceneManager.AddCameraSceneNode(parentNode); } AnimatedMesh mesh = Reference.SceneManager.AddHillPlaneMesh("terrain", new Dimension2Df(512, 512), new Dimension2D(256, 256), 0.0f, new Dimension2Df(0, 0), new Dimension2Df(1024, 1024)); SceneNode amsn = Reference.SceneManager.AddOctTreeSceneNode(mesh, parentNode, -1, 128); amsn.Position = new Vector3D(128, 0, 128); amsn.SetMaterialTexture(0, Reference.VideoDriver.GetTexture(Util.ApplicationDataDirectory + @"\media\textures\sand01.jpg")); AnimatedMesh watermesh = Reference.SceneManager.AddHillPlaneMesh("realisticwater", Size, new Dimension2D(1, 1), 0f, new Dimension2Df(0, 0), new Dimension2Df(1, 1)); WaterSceneNode = Reference.SceneManager.AddOctTreeSceneNode(watermesh, parentNode, -1, 128); Texture bumpTexture = Reference.VideoDriver.GetTexture(Util.ApplicationDataDirectory + @"\media\textures\waterbump.jpg"); GPUProgrammingServices gpuProgrammingServices = Reference.VideoDriver.GPUProgrammingServices; string path = Util.ApplicationDataDirectory + @"\media\shaders\" + filename; if (System.IO.File.Exists(path)) { try { ShaderMaterial = Reference.VideoDriver.GPUProgrammingServices.AddHighLevelShaderMaterialFromFiles( path, "VertexShaderFunction", VertexShaderType._2_0, path, "PixelShaderFunction", PixelShaderType._2_0, ShaderEvent, MaterialType.Lightmap, 0 ); } catch (Exception e) { Reference.Log.Fatal("Load", e); } if (ShaderMaterial > 0) Reference.Log.Debug("Load: Loaded" + path); else Reference.Log.Debug("Load: not Loaded:" + path); } else { Viewer.Log.Warn("[SHADER] [SEA] Shader file was not found: " + Util.ApplicationDataDirectory + @"\media\shaders\" + filename); } float waterheight = 0; if (Reference.Viewer.ProtocolManager.AvatarConnection.m_user.Network.CurrentSim != null) { waterheight = Reference.Viewer.ProtocolManager.AvatarConnection.m_user.Network.CurrentSim.WaterHeight; } WaterSceneNode.Position = new Vector3D(128, waterheight, 128); WaterSceneNode.Scale = new Vector3D(200, 1, 200); WaterSceneNode.SetMaterialType(ShaderMaterial); WaterSceneNode.SetMaterialTexture(0, bumpTexture); RefractionMap = Reference.VideoDriver.CreateRenderTargetTexture(renderTargetSize); ReflectionMap = Reference.VideoDriver.CreateRenderTargetTexture(renderTargetSize); WaterSceneNode.SetMaterialTexture(1, RefractionMap); WaterSceneNode.SetMaterialTexture(2, ReflectionMap); } return ShaderMaterial; }