protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; items.Add(new GLColorShaderWorld(), "COSW"); GLRenderState rl1 = GLRenderState.Lines(1); { rObjects.Add(items.Shader("COSW"), "L1", // horizontal GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl1, GLShapeObjectFactory.CreateLines(new Vector3(-100, 0, -100), new Vector3(-100, 0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Gray }) ); rObjects.Add(items.Shader("COSW"), // vertical GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl1, GLShapeObjectFactory.CreateLines(new Vector3(-100, 0, -100), new Vector3(100, 0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Gray }) ); } items.Add(new GLTexture2D(Properties.Resources.galheightmap7, SizedInternalFormat.Rgba8), "gal"); items.Add(new GLGalShader(), "TEX-NC"); GLRenderState rg = GLRenderState.Quads(cullface: false); rObjects.Add(items.Shader("TEX-NC"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rg, GLShapeObjectFactory.CreateQuad(200.0f, 200.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("gal"), new Vector3(0, 0, 0)) )); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 100000f; gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.PosCamera.ZoomMin = 0.1f; gl3dcontroller.PosCamera.ZoomScaling = 1.1f; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 1.0f * Math.Min(eyedist / 1000, 10)); }; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; boundingbox = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, vsize, front, 1), new Vector4(right, vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, vsize, back, 1), new Vector4(right, vsize, back, 1), new Vector4(right, -vsize, back, 1), }; Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; { items.Add(new GLFixedShader(System.Drawing.Color.Yellow), "LINEYELLOW"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); } { items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "solmarker"); items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); GLRenderState rq = GLRenderState.Quads(cullface: false); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, 1000, 0)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, -1000, 0)) )); items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "sag"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, 2000, 25899)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, -2000, 25899)) )); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "bp"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("bp"), new Vector3(-1111f, 0, 65269)) )); } if (false) // galaxy { volumetricblock = new GLVolumetricUniformBlock(); items.Add(volumetricblock, "VB"); int sc = 1; GLTexture3D noise3d = new GLTexture3D(1024 * sc, 64 * sc, 1024 * sc, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(noise3d, "Noise"); ComputeShaderNoise3D csn = new ComputeShaderNoise3D(noise3d.Width, noise3d.Height, noise3d.Depth, 128 * sc, 16 * sc, 128 * sc); // must be a multiple of localgroupsize in csn csn.StartAction += (A, m) => { noise3d.BindImage(3); }; csn.Run(); // compute noise GLTexture1D gaussiantex = new GLTexture1D(1024, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(gaussiantex, "Gaussian"); // set centre=width, higher widths means more curve, higher std dev compensate. // fill the gaussiantex with data ComputeShaderGaussian gsn = new ComputeShaderGaussian(gaussiantex.Width, 2.0f, 2.0f, 1.4f, 4); gsn.StartAction += (A, m) => { gaussiantex.BindImage(4); }; gsn.Run(); // compute noise GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits); //float[] gdata = gaussiantex.GetTextureImageAsFloats(OpenTK.Graphics.OpenGL4.PixelFormat.Red); // read back check //for( int i = 0; i < gdata.Length; i++ ) //{ // double v = ((float)i / gdata.Length-0.5)*2*2; // double r = ObjectExtensionsNumbersBool.GaussianDist(v, 2, 1.4); // // System.Diagnostics.Debug.WriteLine(i + ":" + gdata[i] + ": " + r); //} // load one upside down and horz flipped, because the volumetric co-ords are 0,0,0 bottom left, 1,1,1 top right GLTexture2D galtex = new GLTexture2D(Properties.Resources.Galaxy_L180, SizedInternalFormat.Rgba8); items.Add(galtex, "gal"); GalaxyShader gs = new GalaxyShader(); items.Add(gs, "Galaxy"); // bind the galaxy texture, the 3dnoise, and the gaussian 1-d texture for the shader gs.StartAction = (a, m) => { galtex.Bind(1); noise3d.Bind(3); gaussiantex.Bind(4); }; // shader requires these, so bind using shader GLRenderState rt = GLRenderState.Tri(); galaxy = GLRenderableItem.CreateNullVertex(PrimitiveType.Points, rt); // no vertexes, all data from bound volumetric uniform, no instances as yet rObjects.Add(items.Shader("Galaxy"), galaxy); } if (true) // star points { int gran = 8; Bitmap img = Properties.Resources.Galaxy_L180; Bitmap heat = img.Function(img.Width / gran, img.Height / gran, mode: GLOFC.Utils.BitMapHelpers.BitmapFunction.HeatMap); heat.Save(@"c:\code\heatmap.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); Random rnd = new Random(23); GLBuffer buf = new GLBuffer(16 * 500000); // since RND is fixed, should get the same number every time. buf.StartWrite(0); // get a ptr to the whole schebang int xcw = (right - left) / heat.Width; int zch = (back - front) / heat.Height; int points = 0; for (int x = 0; x < heat.Width; x++) { for (int z = 0; z < heat.Height; z++) { int i = heat.GetPixel(x, z).R; int ii = i * i * i; if (ii > 32 * 32 * 32) { int gx = left + x * xcw; int gz = front + z * zch; float dx = (float)Math.Abs(gx) / 45000; float dz = (float)Math.Abs(25889 - gz) / 45000; double d = Math.Sqrt(dx * dx + dz * dz); // 0 - 0.1412 d = 1 - d; // 1 = centre, 0 = unit circle d = d * 2 - 1; // -1 to +1 double dist = ObjectExtensionsNumbersBool.GaussianDist(d, 1, 1.4); int c = Math.Min(Math.Max(ii / 140000, 0), 20); dist *= 2000; GLPointsFactory.RandomStars4(buf, c, gx, gx + xcw, gz, gz + zch, (int)dist, (int)-dist, rnd, w: i); points += c; System.Diagnostics.Debug.Assert(points < buf.Length / 16); } } } buf.StopReadWrite(); items.Add(new GalaxyStarDots(), "SD"); GLRenderState rp = GLRenderState.Points(1); rp.DepthTest = false; rObjects.Add(items.Shader("SD"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, buf, points)); System.Diagnostics.Debug.WriteLine("Stars " + points); } if (true) // point sprite { items.Add(new GLTexture2D(Properties.Resources.StarFlare2, SizedInternalFormat.Rgba8), "lensflare"); items.Add(new GLPointSpriteShader(items.Tex("lensflare"), 64, 40), "PS1"); var p = GLPointsFactory.RandomStars4(1000, 0, 25899, 10000, 1000, -1000); GLRenderState rps = GLRenderState.PointSprites(); rps.DepthTest = false; rObjects.Add(items.Shader("PS1"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Points, rps, p, new Color4[] { Color.White })); } { items.Add(new DynamicGridVertexShader(Color.Cyan), "PLGRIDVertShader"); items.Add(new GLPLFragmentShaderVSColor(), "PLGRIDFragShader"); GLRenderState rl = GLRenderState.Lines(1); rl.DepthTest = false; items.Add(new GLShaderPipeline(items.PLShader("PLGRIDVertShader"), items.PLShader("PLGRIDFragShader")), "DYNGRID"); rObjects.Add(items.Shader("DYNGRID"), "DYNGRIDRENDER", GLRenderableItem.CreateNullVertex(PrimitiveType.Lines, rl, drawcount: 2)); } { items.Add(new DynamicGridCoordVertexShader(), "PLGRIDBitmapVertShader"); items.Add(new GLPLFragmentShaderTexture2DIndexed(0), "PLGRIDBitmapFragShader"); // binding GLRenderState rl = GLRenderState.Tri(cullface: false); rl.DepthTest = false; gridtexcoords = new GLTexture2DArray(); items.Add(gridtexcoords, "PLGridBitmapTextures"); GLShaderPipeline sp = new GLShaderPipeline(items.PLShader("PLGRIDBitmapVertShader"), items.PLShader("PLGRIDBitmapFragShader")); items.Add(sp, "DYNGRIDBitmap"); rObjects.Add(items.Shader("DYNGRIDBitmap"), "DYNGRIDBitmapRENDER", GLRenderableItem.CreateNullVertex(PrimitiveType.TriangleStrip, rl, drawcount: 4, instancecount: 9)); } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; matrixcalc = new GLMatrixCalc(); matrixcalc.PerspectiveNearZDistance = 1f; matrixcalc.PerspectiveFarZDistance = worldsize * 2; matrixcalc.InPerspectiveMode = true; matrixcalc.ResizeViewPort(this, glwfc.Size); displaycontrol = new GLControlDisplay(items, glwfc, matrixcalc); // hook form to the window - its the master, it takes its size fro mc.ScreenCoordMax displaycontrol.Focusable = true; // we want to be able to focus and receive key presses. displaycontrol.Name = "displaycontrol"; displaycontrol.Paint += (o, ts) => // subscribing after start means we paint over the scene, letting transparency work { // MCUB set up by Controller3DDraw which did the work first displaycontrol.Render(glwfc.RenderState, ts); }; double startspeed = 60 * 60 * 6; // in sec GLImage minus = new GLImage("plus", new Rectangle(0, 0, 32, 32), Properties.Resources.GoBackward); minus.MouseClick += (e1, m1) => { currentjd -= 365; }; displaycontrol.Add(minus); GLImage back = new GLImage("back", new Rectangle(40, 0, 32, 32), Properties.Resources.Backwards); back.MouseClick += (e1, m1) => { if (jdscaling > 0) { jdscaling /= 2; } else if (jdscaling < 0) { jdscaling *= 2; } else { jdscaling = -startspeed; } }; displaycontrol.Add(back); GLImage pause = new GLImage("back", new Rectangle(80, 0, 32, 32), Properties.Resources.Pause); pause.MouseClick += (e1, m1) => { jdscaling = 0; }; displaycontrol.Add(pause); GLImage fwd = new GLImage("fwd", new Rectangle(120, 0, 32, 32), Properties.Resources.Forward); fwd.MouseClick += (e1, m1) => { if (jdscaling < 0) { jdscaling /= 2; } else if (jdscaling > 0) { jdscaling *= 2; } else { jdscaling = startspeed; } }; displaycontrol.Add(fwd); GLImage plus = new GLImage("plus", new Rectangle(160, 0, 32, 32), Properties.Resources.GoForward); plus.MouseClick += (e1, m1) => { currentjd += 365; }; displaycontrol.Add(plus); status = new GLLabel("state", new Rectangle(200, 0, 400, 20), "Label", Color.DarkOrange); displaycontrol.Add(status); datalabel = new GLLabel("datalabel", new Rectangle(0, 40, 400, 100), "", Color.DarkOrange); datalabel.TextAlign = ContentAlignment.TopLeft; displaycontrol.Add(datalabel); gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 3000F; gl3dcontroller.Start(matrixcalc, displaycontrol, new Vector3(0, 0, 0), new Vector3(135f, 0, 0f), 0.025F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 100.0f); }; items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLTexturedShaderObjectCommonTranslation(), "TEXOCT"); items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "golden"); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); #region coloured lines int gridsize = (int)(worldsize * mscaling); int markers = gridsize / 20; { GLRenderState lines = GLRenderState.Lines(1); Color gridcolour = Color.FromArgb(255, 60, 60, 60); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(-gridsize, -0, gridsize), new Vector3(markers, 0, 0), gridsize / markers * 2 + 1), new Color4[] { gridcolour }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(gridsize, -0, -gridsize), new Vector3(0, 0, markers), gridsize / markers * 2 + 1), new Color4[] { gridcolour })); } rObjects.Add(new GLOperationClearDepthBuffer()); { GLRenderState rt = GLRenderState.Tri(); float sunscaled = sunradiusm * mscaling * sunscaleup; rObjects.Add(items.Shader("TEXOCT"), "sun", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, sunscaled), new GLRenderDataTranslationRotationTexture(items.Tex("golden"), new Vector3(0, 0, 0)) )); } #endregion { // debug check DateTime t = new DateTime(2000, 1, 1, 12, 0, 0); double jd = t.ToJulianDate(); DateTime t2 = jd.JulianToDateTime(); System.Diagnostics.Debug.WriteLine($"Date time {t} JD {jd} back to {t2}"); } items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block currentjd = KeplerOrbitElements.J2000; jdscaling = 0; bodies = new KeplerOrbitElements[4]; bodypositions = new GLRenderDataTranslationRotationTexture[4]; // earth bodies[0] = new KeplerOrbitElements(true, semimajoraxiskm: 0.38709893 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/mercuryfact.html eccentricity: 0.20563069, inclination: 7.00487, longitudeofascendingnode: 48.33167, longitudeofperihelion: 77.45645, meanlongitude: 252.25084, currentjd); bodies[1] = new KeplerOrbitElements(true, semimajoraxiskm: 0.72333199 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/venusfact.html eccentricity: 0.00677323, inclination: 3.39471, longitudeofascendingnode: 76.68069, longitudeofperihelion: 131.53298, meanlongitude: 181.97973, currentjd); bodies[2] = new KeplerOrbitElements(true, semimajoraxiskm: 1.49596E+08, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html eccentricity: 0.0167086, inclination: 0.00005, longitudeofascendingnode: -11.26064, longitudeofperihelion: 102.94719, meanlongitude: 100.46435, currentjd); bodies[3] = new KeplerOrbitElements(true, semimajoraxiskm: 1.52366231 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/marsfact.html eccentricity: 0.09341233, inclination: 1.85061, longitudeofascendingnode: 49.57854, longitudeofperihelion: 336.04084, meanlongitude: 355.45332, currentjd); float planetsize = earthradiusm * mscaling * planetscaleup; for (int i = 0; i < bodies.Length; i++) { bodies[i].CentralMass = Msol; System.Diagnostics.Debug.WriteLine($"{i} {bodies[i].OrbitalPeriodS/60/60/24} {bodies[i].CalculateMass(bodies[i].OrbitalPeriodS)}"); bodypositions[i] = new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(0, 0, 0)); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEXOCT"), "Body" + i, GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, planetsize), bodypositions[i])); Vector4[] orbit = bodies[i].Orbit(currentjd, 1, mscaling); GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.LineStrip, lines, orbit, new Color4[] { Color.FromArgb(255, 128, 0, 0) })); } systemtimer.Interval = 25; systemtimer.Tick += new EventHandler(SystemTick); systemtimer.Start(); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; // operate matrixcalc in +Z away mode (default), in perspective mode (default) matrixcalc = new GLMatrixCalc(); // must make after GL window is made matrixcalc.ResizeViewPort(this, glwfc.Size); // inform matrix calc of window size matrixcalc.CalculateModelMatrix(new Vector3(0, 0, 0), new Vector2(135, 0), 50, 0); // set up the lookat position, the camera direction, the distance and rotation matrixcalc.CalculateProjectionMatrix(); // and set the project matrix glwfc.Paint += Draw; // register for draw // disposable items are stored in GLItemsList, so they can be cleanly disposed of at the end // make three stock shaders with names items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); // make a texture from resources called dotted2 items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted2"); // render state for lines GLRenderState lines = GLRenderState.Lines(1); // make a set of vertices from the shape factory var rs1 = GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21); // make a array of colours for the vertexes (note do not need a full set, the render creator will repeat them automatically) var rc1 = new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed }; // make a render item, indicating type (Lines), vertexes (rs1) and colours (rc1) var ri1 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, rs1, rc1); // add to render list - paint with this shader, and this render rObjects.Add(items.Shader("COSW"), ri1); // do more.. rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed })); // render state for triangles GLRenderState rc = GLRenderState.Tri(); rc.CullFace = false; rObjects.Add(items.Shader("COSOT"), "scopen", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(-10, 0, -10)) )); rObjects.Add(items.Shader("COSOT"), "scopen2", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red }, new GLRenderDataTranslationRotation(new Vector3(10, 0, 10)) )); // render state for quads GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("TEXOT"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(5.0f, 5.0f, new Vector3(0f.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(0, 0, 0)) )); // make a Uniformblock to hold matrix info items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; glwfc.EnsureCurrentContext(); // paranoid check gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 1000f; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "dotted"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted2"); items.Add(new GLTexture2D(Properties.Resources.Logo8bpp, SizedInternalFormat.Rgba8), "logo8bpp"); items.Add(new GLTexture2D(Properties.Resources.smile5300_256x256x8, SizedInternalFormat.Rgba8), "smile"); #region coloured lines if (true) { GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed })); } #endregion #region Coloured triangles if (true) { GLRenderState rc = GLRenderState.Tri(); rc.CullFace = false; rObjects.Add(items.Shader("COSOT"), "scopen", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20)) )); rObjects.Add(items.Shader("COSOT"), "scopen2", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red }, new GLRenderDataTranslationRotation(new Vector3(-10, -3, -20)) )); } #endregion #region textures if (true) { GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("TEXOT"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1.0f, 1.0f, new Vector3(-90f.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(0, 0, 0)) )); } #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion //new Thread(() => new Window2().ShowDialog()).Start(); // in another thread, it works frm = new Window2(); frm.Show(); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; var ext = GLStatics.Extensions(); gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 1000f; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); { Bitmap bmp = new Bitmap(Properties.Resources.dotted2); // demo argb copy byte[] argbbytes = bmp.GetARGBBytes(); Bitmap copy = GLOFC.Utils.BitMapHelpers.CreateBitmapFromARGBBytes(bmp.Width, bmp.Height, argbbytes); var tex = new GLTexture2D(copy, SizedInternalFormat.Rgba8); items.Add(tex, "dotted2"); Bitmap bmp2 = tex.GetBitmap(inverty: false); bmp2.Save(@"c:\code\dotted2.bmp"); } #region coloured lines if (true) { GLRenderState lines = GLRenderState.Lines(5); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.White, Color.Red, Color.DarkRed, Color.DarkRed }) ); GLRenderState lines2 = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Orange, Color.Blue, Color.DarkRed, Color.DarkRed })); } if (true) { GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); } #endregion #region Coloured triangles if (true) { GLRenderState rc = GLRenderState.Tri(); rc.CullFace = false; rObjects.Add(items.Shader("COSOT"), "scopen", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20)) )); } #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion #region FB GLTexture2D ctex = new GLTexture2D(); items.Add(ctex, "drawnbitmap"); if (true) { int width = 1024, height = 768; // set up FB // NOTE: things end up inverted in Y in the texture, this is because textures are bottom up structures - seems the internet agrees GLFrameBuffer fb = new GLFrameBuffer(); // attach a texture to draw to ctex.CreateOrUpdateTexture(width, height, OpenTK.Graphics.OpenGL4.SizedInternalFormat.Rgba8, 1); ctex.SetMinMagLinear(); fb.AttachColor(ctex, 0, 0); GLRenderBuffer rb = new GLRenderBuffer(); items.Add(rb); rb.Allocate(RenderbufferStorage.DepthComponent32f, ctex.Width, ctex.Height); fb.AttachDepth(rb); // bind Framebuffer to system for it to be the target to draw to, with a default back colour fb.BindColor(new OpenTK.Graphics.Color4(40, 40, 40, 255)); GLMatrixCalc mc = new GLMatrixCalc(); mc.PerspectiveNearZDistance = 1f; mc.PerspectiveFarZDistance = 1000f; mc.ResizeViewPort(this, new Size(ctex.Width, ctex.Height)); Vector3 lookat = new Vector3(0, 0, 0); Vector2 camerapos = new Vector2(110f, 0); mc.CalculateModelMatrix(lookat, camerapos, 20F, 0); mc.CalculateProjectionMatrix(); ((GLMatrixCalcUniformBlock)items.UB("MCUB")).SetFull(mc); var renderState = GLRenderState.Start(); Vector4[] p = new Vector4[4]; int size = 64; int offset = 10; p[0] = new Vector4(offset, offset, 0, 1); // topleft - correct winding for our system. For dotted, red/blue at top as dots p[1] = new Vector4(offset, offset + size, 0, 1); // bottomleft p[2] = new Vector4(offset + size, offset, 0, 1); // topright p[3] = new Vector4(offset + size, offset + size, 0, 1); // botright items.Add(new GLDirect(), "fbds1"); GLRenderState rts = GLRenderState.Tri(); GLRenderDataTexture rdt = new GLRenderDataTexture(items.Tex("dotted2")); var ri = GLRenderableItem.CreateVector4(items, PrimitiveType.TriangleStrip, rts, p, rdt); ri.Execute(items.Shader("fbds1"), renderState, mc); GLRenderState lines = GLRenderState.Lines(1); var l1 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed }); l1.Execute(items.Shader("COSW"), renderState, mc); var l2 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed }); l2.Execute(items.Shader("COSW"), renderState, mc); var l3 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }); l3.Execute(items.Shader("COSW"), renderState, mc); var l4 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }); l4.Execute(items.Shader("COSW"), renderState, mc); GLRenderState rc = GLRenderState.Tri(); rc.CullFace = false; var ri2 = GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20))); ri2.Execute(items.Shader("COSOT"), renderState, mc); GLRenderState rq = GLRenderState.Quads(); var ri3 = GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rq, GLShapeObjectFactory.CreateQuad(5f, 5f, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(10, 0, 0))); ri3.Execute(items.Shader("TEXOT"), renderState, mc); GLFrameBuffer.UnBind(); gl3dcontroller.MatrixCalc.SetViewPort(); // restore the view port byte[] texdatab = ctex.GetTextureImageAs <byte>(OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, 0, true); Bitmap bmp = GLOFC.Utils.BitMapHelpers.CreateBitmapFromARGBBytes(ctex.Width, ctex.Height, texdatab); bmp.Save(@"c:\code\out.bmp"); } #endregion if (true) { Vector4[] p = new Vector4[4]; int size = 128; int offset = 10; p[0] = new Vector4(offset, offset, 0, 1); // topleft - correct winding for our system. For dotted, red/blue at top as dots p[1] = new Vector4(offset, offset + size, 0, 1); // bottomleft p[2] = new Vector4(offset + size, offset, 0, 1); // topright p[3] = new Vector4(offset + size, offset + size, 0, 1); // botright items.Add(new GLDirect(), "ds1"); GLRenderState rts = GLRenderState.Tri(); GLRenderDataTexture rdt = new GLRenderDataTexture(items.Tex("dotted2")); rObjects.Add(items.Shader("ds1"), "ds1", GLRenderableItem.CreateVector4(items, PrimitiveType.TriangleStrip, rts, p, rdt)); } if (true) { GLRenderState rq = GLRenderState.Quads(); float width = 20F; float height = 20F / ctex.Width * ctex.Height; // TexQuadInv corrects for the inverted FB texture rObjects.Add(items.Shader("TEXOT"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(width, height, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCCW, new GLRenderDataTranslationRotationTexture(ctex, new Vector3(-15, 0, 10)) )); } if (true) { GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("TEXOT"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(5f, 5f, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(10, 0, 0)) )); } dataoutbuffer = items.NewStorageBlock(5); dataoutbuffer.AllocateBytes(sizeof(float) * 4 * 32, OpenTK.Graphics.OpenGL4.BufferUsageHint.DynamicRead); // 32 vec4 back }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 100F; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f; glwfc.BackColor = Color.FromArgb(0, 0, 20); gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(120f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 20.0f); }; // this bit is eye candy just to show its working items.Add(new GLColorShaderWorld(), "COSW"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(-40, 0, 40), new Vector3(10, 0, 0), 9), new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(40, 0, -40), new Vector3(0, 0, 10), 9), new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green }) ); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEX"), "sphere7", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(4, 20.0f), new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(0, 0, 0)) )); // Pass vertex data thru a vertex shader which stores into a block items.Add(new GLShaderPipeline(new GLVertexShaderCompute()), "N1"); vecoutbuffer = new GLStorageBlock(1); // new storage block on binding index 1 which the vertex shader uses vecoutbuffer.AllocateBytes(sizeof(float) * 2048 + sizeof(int), OpenTK.Graphics.OpenGL4.BufferUsageHint.DynamicCopy); // set size of vec buffer //Vector4[] data = new Vector4[] { // new Vector4(1, 2, 3, 0), // new Vector4(4, 5, 6, 0) //}; Vector4[] data = GLSphereObjectFactory.CreateSphereFromTriangles(0, 1.0f); GLRenderState rp = GLRenderState.Points(); rObjects.Add(items.Shader("N1"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, data)); for (double ang = -Math.PI / 2; ang <= Math.PI / 2 + 0.1; ang += 0.1) { Vector3 pos = new Vector3((float)Math.Cos(ang), (float)Math.Sin(ang), 0); Vector3 up = new Vector3(0, 1, 0); float dotp = Vector3.Dot(up, pos); float lens = (float)(up.Length * pos.Length); double computedang = Math.Acos(dotp / lens); System.Diagnostics.Debug.WriteLine(ang.Degrees() + " " + pos + "-> dotp" + dotp + " " + computedang.Degrees()); } items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 100000f; gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 10.0f); }; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; boundingbox = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, vsize, front, 1), new Vector4(right, vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, vsize, back, 1), new Vector4(right, vsize, back, 1), new Vector4(right, -vsize, back, 1), }; Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; { items.Add(new GLFixedShader(System.Drawing.Color.Yellow), "LINEYELLOW"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); } Bitmap[] numbitmaps = new Bitmap[116]; { Font fnt = new Font("Arial", 20); for (int i = 0; i < numbitmaps.Length; i++) { int v = -45000 + 1000 * i; // range from -45000 to +70000 numbitmaps[i] = new Bitmap(100, 100); GLOFC.Utils.BitMapHelpers.DrawTextCentreIntoBitmap(ref numbitmaps[i], v.ToString(), fnt, System.Drawing.Text.TextRenderingHint.ClearTypeGridFit, Color.Red, Color.AliceBlue); } GLTexture2DArray numtextures = new GLTexture2DArray(numbitmaps, SizedInternalFormat.Rgba8, ownbmp: true); items.Add(numtextures, "Nums"); Matrix4[] numberposx = new Matrix4[(right - left) / 1000 + 1]; for (int i = 0; i < numberposx.Length; i++) { numberposx[i] = Matrix4.CreateScale(1); numberposx[i] *= Matrix4.CreateRotationX(-25f.Radians()); numberposx[i] *= Matrix4.CreateTranslation(new Vector3(left + 1000 * i, 0, front)); } GLShaderPipeline numshaderx = new GLShaderPipeline(new GLPLVertexShaderModelMatrixTexture(), new GLPLFragmentShaderTexture2DIndexed(0)); items.Add(numshaderx, "IC-X"); GLRenderState rq = GLRenderState.Quads(cullface: false); GLRenderDataTexture rt = new GLRenderDataTexture(items.Tex("Nums")); rObjects.Add(numshaderx, "xnum", GLRenderableItem.CreateVector4Vector2Matrix4(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(500.0f), GLShapeObjectFactory.TexQuadCW, numberposx, rt, numberposx.Length)); Matrix4[] numberposz = new Matrix4[(back - front) / 1000 + 1]; for (int i = 0; i < numberposz.Length; i++) { numberposz[i] = Matrix4.CreateScale(1); numberposz[i] *= Matrix4.CreateRotationX(-25f.Radians()); numberposz[i] *= Matrix4.CreateTranslation(new Vector3(right + 1000, 0, front + 1000 * i)); } GLShaderPipeline numshaderz = new GLShaderPipeline(new GLPLVertexShaderModelMatrixTexture(), new GLPLFragmentShaderTexture2DIndexed(25)); items.Add(numshaderz, "IC-Z"); rObjects.Add(numshaderz, "ynum", GLRenderableItem.CreateVector4Vector2Matrix4(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(500.0f), GLShapeObjectFactory.TexQuadCW, numberposz, rt, numberposz.Length)); } items.Add(new GLColorShaderWorld(), "COSW"); float h = 50; if (h != -1) { GLRenderState rl = GLRenderState.Lines(1); int dist = 1000; //20? Color cr = Color.FromArgb(50, Color.Red); rObjects.Add(items.Shader("COSW"), // horizontal GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(left, h, back), new Vector3(dist, 0, 0), (back - front) / dist + 1), new Color4[] { cr }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(right, h, front), new Vector3(0, 0, dist), (right - left) / dist + 1), new Color4[] { cr }) ); } { items.Add(new GLTexture2D(numbitmaps[45], SizedInternalFormat.Rgba8), "solmarker"); items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); GLRenderState rq = GLRenderState.Quads(cullface: false); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, 1000, 0)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, -1000, 0)) )); items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "sag"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, 2000, 25899)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, -2000, 25899)) )); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "bp"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("bp"), new Vector3(-1111f, 0, 65269)) )); } if (true) // galaxy { volumetricblock = new GLVolumetricUniformBlock(); items.Add(volumetricblock, "VB"); int sc = 1; GLTexture3D noise3d = new GLTexture3D(1024 * sc, 64 * sc, 1024 * sc, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(noise3d, "Noise"); ComputeShaderNoise3D csn = new ComputeShaderNoise3D(noise3d.Width, noise3d.Height, noise3d.Depth, 128 * sc, 16 * sc, 128 * sc); // must be a multiple of localgroupsize in csn csn.StartAction += (A, m) => { noise3d.BindImage(3); }; csn.Run(); // compute noise GLTexture1D gaussiantex = new GLTexture1D(1024, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(gaussiantex, "Gaussian"); // set centre=width, higher widths means more curve, higher std dev compensate. // fill the gaussiantex with data ComputeShaderGaussian gsn = new ComputeShaderGaussian(gaussiantex.Width, 2.0f, 2.0f, 1.4f, 4); gsn.StartAction += (A, m) => { gaussiantex.BindImage(4); }; gsn.Run(); // compute noise GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits); //float[] gdata = gaussiantex.GetTextureImageAsFloats(OpenTK.Graphics.OpenGL4.PixelFormat.Red); // read back check //for( int i = 0; i < gdata.Length; i++ ) //{ // double v = ((float)i / gdata.Length-0.5)*2*2; // double r = ObjectExtensionsNumbersBool.GaussianDist(v, 2, 1.4); // // System.Diagnostics.Debug.WriteLine(i + ":" + gdata[i] + ": " + r); //} // load one upside down and horz flipped, because the volumetric co-ords are 0,0,0 bottom left, 1,1,1 top right GLTexture2D galtex = new GLTexture2D(Properties.Resources.Galaxy_L180, SizedInternalFormat.Rgba8); items.Add(galtex, "gal"); GalaxyShader gs = new GalaxyShader(); items.Add(gs, "Galaxy"); // bind the galaxy texture, the 3dnoise, and the gaussian 1-d texture for the shader gs.StartAction = (a, m) => { galtex.Bind(1); noise3d.Bind(3); gaussiantex.Bind(4); }; // shader requires these, so bind using shader GLRenderState rt = GLRenderState.Tri(); galaxy = GLRenderableItem.CreateNullVertex(PrimitiveType.Points, rt); // no vertexes, all data from bound volumetric uniform, no instances as yet rObjects.Add(items.Shader("Galaxy"), galaxy); } if (true) // star points { int gran = 8; Bitmap img = Properties.Resources.Galaxy_L180; Bitmap heat = img.Function(img.Width / gran, img.Height / gran, mode: GLOFC.Utils.BitMapHelpers.BitmapFunction.HeatMap); heat.Save(@"c:\code\heatmap.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); if (false) // heat map checkout debug { List <Vector4> points = new List <Vector4>(); int xcw = (right - left) / heat.Width; int zch = (back - front) / heat.Height; for (int x = 0; x < heat.Width; x++) { for (int z = 0; z < heat.Height; z++) { int gx = left + x * xcw + xcw / 2; int gz = front + z * zch + zch / 2; Color px = heat.GetPixel(x, z); //System.Diagnostics.Debug.WriteLine(x + "," + z + " = " + gx + "," + gz + " : " + px.R); points.Add(new Vector4(gx, 2000, gz, px.R)); } } items.Add(new GLHeatMapIntensity(), "ShP"); GLRenderState rp = GLRenderState.Points(); rp.DepthTest = false; rObjects.Add(items.Shader("ShP"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, points.ToArray())); } if (false) // v1 via array { List <Vector4> points = new List <Vector4>(); Random rnd = new Random(23); int xcw = (right - left) / heat.Width; int zch = (back - front) / heat.Height; for (int x = 0; x < heat.Width; x++) { for (int z = 0; z < heat.Height; z++) { int i = heat.GetPixel(x, z).R; int ii = i * i * i; if (ii > 32 * 32 * 32) { int gx = left + x * xcw; int gz = front + z * zch; float dx = (float)Math.Abs(gx) / 45000; float dz = (float)Math.Abs(25889 - gz) / 45000; double d = Math.Sqrt(dx * dx + dz * dz); // 0 - 0.1412 d = 1 - d; // 1 = centre, 0 = unit circle d = d * 2 - 1; // -1 to +1 double dist = ObjectExtensionsNumbersBool.GaussianDist(d, 1, 1.4); int c = Math.Min(Math.Max(ii / 100000, 0), 20); dist *= 2000; var rs = GLPointsFactory.RandomStars4(c, gx, gx + xcw, gz, gz + zch, (int)dist, (int)-dist, rnd, w: i); if (z == heat.Height / 2) { System.Diagnostics.Debug.WriteLine(gx + "," + gz + "; " + dx + "," + dz + " = " + i + " " + c + " " + d + "=h " + dist); } //var rs = GLPointsFactory.RandomStars4(500, gx, gx + xcw, gz, gz + zch, (int)dist, (int)-dist, rnd, w:i); points.AddRange(rs); } } } items.Add(new GalaxyStarDots(), "SD"); GLRenderState rp = GLRenderState.Points(1); rp.DepthTest = false; rObjects.Add(items.Shader("SD"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, points.ToArray())); } if (true) //v2 direct to buffer { Random rnd = new Random(23); GLBuffer buf = new GLBuffer(16 * 500000); // since RND is fixed, should get the same number every time. buf.StartWrite(0); // get a ptr to the whole schebang int xcw = (right - left) / heat.Width; int zch = (back - front) / heat.Height; int points = 0; for (int x = 0; x < heat.Width; x++) { for (int z = 0; z < heat.Height; z++) { int i = heat.GetPixel(x, z).R; int ii = i * i * i; if (ii > 32 * 32 * 32) { int gx = left + x * xcw; int gz = front + z * zch; float dx = (float)Math.Abs(gx) / 45000; float dz = (float)Math.Abs(25889 - gz) / 45000; double d = Math.Sqrt(dx * dx + dz * dz); // 0 - 0.1412 d = 1 - d; // 1 = centre, 0 = unit circle d = d * 2 - 1; // -1 to +1 double dist = ObjectExtensionsNumbersBool.GaussianDist(d, 1, 1.4); int c = Math.Min(Math.Max(ii / 140000, 0), 40); dist *= 2000; GLPointsFactory.RandomStars4(buf, c, gx, gx + xcw, gz, gz + zch, (int)dist, (int)-dist, rnd, w: i); points += c; System.Diagnostics.Debug.Assert(points < buf.Length / 16); } } } buf.StopReadWrite(); items.Add(new GalaxyStarDots(), "SD"); GLRenderState rp = GLRenderState.Points(1); rp.DepthTest = false; rObjects.Add(items.Shader("SD"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, buf, points)); System.Diagnostics.Debug.WriteLine("Stars " + points); } } if (true) // point sprite { items.Add(new GLTexture2D(Properties.Resources.star_grey64, SizedInternalFormat.Rgba8), "lensflare"); items.Add(new GLPointSpriteShader(items.Tex("lensflare")), "PS1"); int dist = 20000; var p = GLPointsFactory.RandomStars4(100, -dist, dist, 25899 - dist, 25899 + dist, 2000, -2000); GLRenderState rps = GLRenderState.PointSprites(); rps.DepthTest = false; rObjects.Add(items.Shader("PS1"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Points, rps, p, new Color4[] { Color.White })); } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 21000f; gl3dcontroller.MouseTranslateAmountAtZoom1PerPixel = 0.5f; gl3dcontroller.ZoomDistance = 50F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(135f, 0, 0f), 1F); bool useopenglcoords = true; // true for +Z towards viewer. OFC is using mostly +Z away from viewer if (useopenglcoords) { gl3dcontroller.MatrixCalc.ModelAxisPositiveZAwayFromViewer = false; gl3dcontroller.SetPositionCamera(new Vector3(0, 0, 0), new Vector3(0, 0, 100), 0f); gl3dcontroller.RecalcMatrices(); } gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; // create stock shaders items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); // create stock textures items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "dotted"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted2"); items.Add(new GLTexture2D(Properties.Resources.Logo8bpp, SizedInternalFormat.Rgba8), "logo8bpp"); items.Add(new GLTexture2D(Properties.Resources.smile5300_256x256x8, SizedInternalFormat.Rgba8), "smile"); #region coloured lines if (true) { GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Red, Color.Red, Color.DarkRed, Color.DarkRed })); } if (true) { GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); } #endregion #region Coloured cubes if (true) { GLRenderState rc = GLRenderState.Tri(); rc.CullFace = false; var cube1pos = GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f, new Vector3(10, 2.5f, 10)); var cube1dtr = new GLRenderDataTranslationRotation(new Vector3(0, 0, 0)); // these are on positive Z and x rObjects.Add(items.Shader("COSOT"), "scopen", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, cube1pos, new Color4[] { Color4.Green, Color4.Green, Color4.Blue, Color4.Blue, Color4.Cyan, Color4.Cyan }, cube1dtr )); var cube2pos = GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f, new Vector3(10, 2.5f, 50)); rObjects.Add(items.Shader("COSOT"), "scopen1", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, cube2pos, new Color4[] { Color4.Green, Color4.Green, Color4.Blue, Color4.Blue, Color4.Cyan, Color4.Cyan }, cube1dtr )); // this one above cube2 for use in testing ortho mode var cube3pos = GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f, new Vector3(10, 10.25f, 50)); rObjects.Add(items.Shader("COSOT"), "scopen2", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, cube3pos, new Color4[] { Color4.Yellow }, cube1dtr )); // negative z and x rObjects.Add(items.Shader("COSOT"), "scopen3", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red }, new GLRenderDataTranslationRotation(new Vector3(-10, -2.5f, -10)) )); rObjects.Add(items.Shader("COSOT"), "scopen4", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Red }, new GLRenderDataTranslationRotation(new Vector3(-10, -2.5f, -20)) )); } #endregion #region textures if (true) { // texture facing upwards, culled if viewer below it GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("TEXOT"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(5.0f, 5.0f, new Vector3(-0f.Radians(), 0, 0), ccw: gl3dcontroller.MatrixCalc.ModelAxisPositiveZAwayFromViewer), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(0, 0, 0)) )); } #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion }
// Demonstrate buffer feedback AND geo shader add vertex/dump vertex protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f; glwfc.BackColor = Color.FromArgb(0, 0, 60); gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(120f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 20.0f); }; items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 { items.Add(new GLColorShaderWorld(), "COS"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("COS"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(-40, 0, 40), new Vector3(10, 0, 0), 9), new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green }) ); rObjects.Add(items.Shader("COS"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, null, GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(40, 0, -40), new Vector3(0, 0, 10), 9), new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green }) ); } { items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEX"), "sphere7", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(4, 10.0f), new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(-30, 0, 0)) )); } { var sunvertex = new GLPLVertexShaderModelCoordWorldAutoscale(new Color[] { Color.Yellow, Color.FromArgb(255, 230, 230, 1) }); items.Add(new GLShaderPipeline(sunvertex, new GLPLStarSurfaceFragmentShader()), "STAR"); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("STAR"), "sun", GLRenderableItem.CreateVector4(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateSphereFromTriangles(3, 10.0f), new GLRenderDataTranslationRotation(new Vector3(20, 0, 0)), ic: 1)); items.Add(new GLShaderStarCorona(), "CORONA"); GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("CORONA"), GLRenderableItem.CreateVector4(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1f), new GLRenderDataTranslationRotation(new Vector3(20, 0, 0), new Vector3(0, 0, 0), 20f, calclookat: true))); } if (true) { Vector4[] pos = new Vector4[3]; pos[0] = new Vector4(-20, 0, 10, 0); pos[1] = new Vector4(0, 0, 10, 1); pos[2] = new Vector4(20, 0, 10, 2); var shape = GLSphereObjectFactory.CreateSphereFromTriangles(3, 10.0f); GLRenderState rt = GLRenderState.Tri(); GLRenderableItem ri = GLRenderableItem.CreateVector4Vector4(items, PrimitiveType.Triangles, rt, shape, pos, null, pos.Length, 1); var vertshader = new GLPLVertexShaderModelCoordWorldAutoscale(new Color[] { Color.Red, Color.Green, Color.Blue }); var shader = new GLShaderPipeline(vertshader, new GLPLStarSurfaceFragmentShader()); items.Add(shader, "STAR-M2"); rObjects.Add(shader, ri); } GLOFC.GLStatics.Check(); GL.Enable(EnableCap.DepthClamp); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 1000f; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOTNoRot"); items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLFixedColorShaderObjectTranslation(Color.Goldenrod), "FCOSOT"); items.Add(new GLTexturedShaderObjectCommonTranslation(), "TEXOCT"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted"); items.Add(new GLTexture2D(Properties.Resources.Logo8bpp, SizedInternalFormat.Rgba8), "logo8bpp"); items.Add(new GLTexture2D(Properties.Resources.wooden, SizedInternalFormat.Rgba8), "wooden"); items.Add(new GLTexture2D(Properties.Resources.shoppinglist, SizedInternalFormat.Rgba8), "shoppinglist"); items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "golden"); items.Add(new GLTexture2D(Properties.Resources.smile5300_256x256x8, SizedInternalFormat.Rgba8), "smile"); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); #region coloured lines GLRenderState def = new GLRenderState() { DepthTest = false }; // set up default state for fixed values - no depth test, rely on stencil if (true) { rObjects.Add(new GLOperationSetStencil()); // set default stencil GLRenderState rq = GLRenderState.Quads(def); IGLProgramShader s = items.Shader("TEXOT"); rObjects.Add(s, "Quad", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(5.0f, 5.0f, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted"), new Vector3(-2, 3, -6)) )); rObjects.Add(new GLOperationStencilOnlyIfEqual()); } #region Coloured triangles if (true) { GLRenderState rc = GLRenderState.Tri(def); rc.CullFace = false; rObjects.Add(items.Shader("COSOT"), "Tri", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20)) )); } if (true) { GLRenderState lines = GLRenderState.Lines(def, 5); rObjects.Add(items.Shader("COSW"), "L1", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.White, Color.Red, Color.DarkRed, Color.DarkRed }) ); GLRenderState lines2 = GLRenderState.Lines(def, 1); rObjects.Add(items.Shader("COSW"), "L2", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Orange, Color.Blue, Color.DarkRed, Color.DarkRed })); rObjects.Add(items.Shader("COSW"), "L3", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); rObjects.Add(items.Shader("COSW"), "L4", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); } #endregion #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion }
/// <summary> /// Create from waveform objects items to paint /// May use multiple creates on the same GLWaveFormObject object /// Ignore objects without materials or vertexes /// </summary> /// <param name="objects">List of waveform objects</param> /// <param name="worldpos">World position to offset objects to </param> /// <param name="rotationradians">Rotation to apply </param> /// <param name="scale">Scaling of objects</param> /// <returns>true if successfully created, else false if a material is not found</returns> public bool Create(List <GLWaveformObject> objects, Vector3 worldpos, Vector3 rotationradians, float scale = 1.0f) { if (objects == null) { return(false); } GLBuffer vert = null; GLRenderState rts = GLRenderState.Tri(); bool okay = false; foreach (var obj in objects) { if (obj.Material.HasChars() && obj.Vertices.Vertices.Count > 0) { if (vert == null) { vert = items.NewBuffer(); vert.AllocateFill(obj.Vertices.Vertices.ToArray(), obj.Vertices.TextureVertices2.ToArray()); // store all vertices and textures into } bool textured = obj.Indices.TextureIndices.Count > 0; string name = obj.ObjectName != null ? obj.ObjectName : obj.GroupName; // name to use for texture/colour if (textured) // using textures need texture indicies { IGLTexture tex = items.Contains(obj.Material) ? items.Tex(obj.Material) : null; if (tex == null) { return(false); } if (shadertexture == null) { shadertexture = new GLTexturedShaderObjectTranslation(); items.Add(shadertexture); } obj.Indices.RefactorVertexIndicesIntoTriangles(); var ri = GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rts, vert, vert.Positions[0], vert.Positions[1], 0, new GLRenderDataTranslationRotationTexture(tex, worldpos, rotationradians, scale)); // renderable item pointing to vert for vertexes ri.CreateElementIndex(items.NewBuffer(), obj.Indices.VertexIndices.ToArray(), 0); // using the refactored indexes, create an index table and use rlist.Add(shadertexture, name, ri); okay = true; } else { // use the name as a colour. Color c = Color.FromName(obj.Material); if (c.A == 0 && c.R == 0 && c.G == 0 && c.B == 0) { if (DefaultColor != Color.Transparent) { c = DefaultColor; } else { return(false); } } if (shadercolor == null) { shadercolor = new GLUniformColorShaderObjectTranslation(); items.Add(shadercolor); } obj.Indices.RefactorVertexIndicesIntoTriangles(); var ri = GLRenderableItem.CreateVector4(items, PrimitiveType.Triangles, rts, vert, 0, 0, new GLRenderDataTranslationRotationColor(c, worldpos, rotationradians, scale)); // renderable item pointing to vert for vertexes ri.CreateElementIndex(items.NewBuffer(), obj.Indices.VertexIndices.ToArray(), 0); // using the refactored indexes, create an index table and use rlist.Add(shadercolor, name, ri); okay = true; } } } return(okay); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 500000f; gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 1.0f * Math.Min(eyedist / 1000, 10)); }; gl3dcontroller.PosCamera.ZoomScaling = 1.1f; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(140.75f, 0, 0), 0.5F); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; { items.Add(new GLFixedColorShaderWorld(System.Drawing.Color.Yellow), "LINEYELLOW"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); } { items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "solmarker"); items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); GLRenderState rq = GLRenderState.Quads(cullface: false); solmarker = new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, 0, 0)); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1.0f, 1.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, solmarker )); } { items.Add(new DynamicGridVertexShader(Color.Cyan), "PLGRIDVertShader"); items.Add(new GLPLFragmentShaderVSColor(), "PLGRIDFragShader"); GLRenderState rl = GLRenderState.Lines(1); rl.DepthTest = false; items.Add(new GLShaderPipeline(items.PLShader("PLGRIDVertShader"), items.PLShader("PLGRIDFragShader")), "DYNGRID"); rObjects.Add(items.Shader("DYNGRID"), "DYNGRIDRENDER", GLRenderableItem.CreateNullVertex(PrimitiveType.Lines, rl, drawcount: 2)); } { items.Add(new DynamicGridCoordVertexShader(), "PLGRIDBitmapVertShader"); items.Add(new GLPLFragmentShaderTexture2DIndexed(0), "PLGRIDBitmapFragShader"); // binding 1 GLRenderState rl = GLRenderState.Tri(cullface: false); rl.DepthTest = false; texcoords = new GLTexture2DArray(); items.Add(texcoords, "PLGridBitmapTextures"); GLShaderPipeline sp = new GLShaderPipeline(items.PLShader("PLGRIDBitmapVertShader"), items.PLShader("PLGRIDBitmapFragShader")); items.Add(sp, "DYNGRIDBitmap"); rObjects.Add(items.Shader("DYNGRIDBitmap"), "DYNGRIDBitmapRENDER", GLRenderableItem.CreateNullVertex(PrimitiveType.TriangleStrip, rl, drawcount: 4, instancecount: 9)); } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 100F; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 20.0f); }; { items.Add(new GLColorShaderWorld(), "COS"); GLRenderState rl = GLRenderState.Lines(1); rObjects.Add(items.Shader("COS"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateBox(400, 200, 40, new Vector3(0, 0, 0), new Vector3(0, 0, 0)), new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green })); } { items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); using (var bmp = BitMapHelpers.DrawTextIntoAutoSizedBitmap("200,100", new Size(200, 100), new Font("Arial", 10.0f), System.Drawing.Text.TextRenderingHint.ClearTypeGridFit, Color.Yellow, Color.Blue)) { items.Add(new GLTexture2D(bmp, SizedInternalFormat.Rgba8), "200,100"); } using (var bmp = GLOFC.Utils.BitMapHelpers.DrawTextIntoAutoSizedBitmap("-200,-100", new Size(200, 100), new Font("Arial", 10.0f), System.Drawing.Text.TextRenderingHint.ClearTypeGridFit, Color.Yellow, Color.Blue)) { items.Add(new GLTexture2D(bmp, SizedInternalFormat.Rgba8), "-200,-100"); } GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(20.0f, 20.0f, new Vector3(-90f.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("200,100"), new Vector3(200, 0, 100)))); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(20.0f, 20.0f, new Vector3(-90f.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("-200,-100"), new Vector3(-200, 0, -100)))); } { items.Add(new GLStarPoints(), "STARS"); Vector3[] stars = GLPointsFactory.RandomStars(10000, -200, 200, -100, 100, 20, -20); GLRenderState rp = GLRenderState.PointsByProgram(); rObjects.Add(items.Shader("STARS"), "Stars", GLRenderableItem.CreateVector3Packed2(items, PrimitiveType.Points, rp, stars, new Vector3(50000, 50000, 50000), 16)); } items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 Closed += ShaderTest_Closed; }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; GLRenderState rl = GLRenderState.Lines(1); { items.Add(new GLFixedShader(System.Drawing.Color.Yellow), "LINEYELLOW"); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); } float h = 0; if (h != -1) { items.Add(new GLColorShaderWorld(), "COS-1L"); int dist = 1000; Color cr = Color.FromArgb(100, Color.White); rObjects.Add(items.Shader("COS-1L"), // horizontal GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(left, h, back), new Vector3(dist, 0, 0), (back - front) / dist + 1), new Color4[] { cr }) ); rObjects.Add(items.Shader("COS-1L"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(right, h, front), new Vector3(0, 0, dist), (right - left) / dist + 1), new Color4[] { cr }) ); } { items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted2"); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Triangles, rt, GLCubeObjectFactory.CreateSolidCubeFromTriangles(2000f), GLCubeObjectFactory.CreateCubeTexTriangles(), new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(-2, 0, 0)) )); } { items.Add(new GLFixedColorShaderWorld(Color.FromArgb(150, Color.Green)), "FCS1"); items.Add(new GLFixedColorShaderWorld(Color.FromArgb(80, Color.Red)), "FCS2"); GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("FCS1"), GLRenderableItem.CreateVector4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000, pos: new Vector3(4000, 500, 0)))); rObjects.Add(items.Shader("FCS2"), GLRenderableItem.CreateVector4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000, pos: new Vector3(4000, 1000, 0)))); } MatrixCalcSpecial mc = new MatrixCalcSpecial(); mc.PerspectiveNearZDistance = 1f; mc.PerspectiveFarZDistance = 500000f; mc.ResizeViewPort(this, glwfc.Size); // must establish size before starting displaycontrol = new GLControlDisplay(items, glwfc, mc); // hook form to the window - its the master, it takes its size fro mc.ScreenCoordMax displaycontrol.Focusable = true; // we want to be able to focus and receive key presses. displaycontrol.Name = "displaycontrol"; GLForm pform = new GLForm("Form1", "GL Control demonstration", new Rectangle(0, 0, 1000, 850)); // pform.BackColor = Color.FromArgb(200, Color.Red); //pform.BackColorGradientDir = 90; //pform.BackColorGradientAlt = Color.FromArgb(200, Color.Yellow); displaycontrol.Add(pform); if (true) { GLPanel p1 = new GLPanel("P3", new Size(150, 150), DockingType.TopLeft, 0); p1.SetMarginBorderWidth(new MarginType(1), 1, Color.Black, new PaddingType(1)); pform.Add(p1); } if (true) { GLTableLayoutPanel ptable = new GLTableLayoutPanel("tablelayout", new Rectangle(5, 200, 190, 190)); ptable.Margin = new MarginType(2); ptable.Padding = new PaddingType(2); ptable.BorderWidth = 1; ptable.Rows = new List <GLTableLayoutPanel.Style> { new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50), new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50) }; ptable.Columns = new List <GLTableLayoutPanel.Style> { new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50), new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50) }; pform.Add(ptable); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted); pti1.Column = 0; pti1.Row = 0; pti1.Dock = DockingType.Fill; ptable.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(100, 0, 24, 24), Properties.Resources.dotted2); pti2.Column = 1; pti1.Row = 0; ptable.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(100, 0, 48, 48), Properties.Resources.ImportSphere); pti3.Column = 0; pti3.Row = 1; pti3.Dock = DockingType.LeftCenter; pti3.ImageStretch = true; ptable.Add(pti3); GLImage pti4 = new GLImage("PTI4", new Rectangle(100, 0, 64, 64), Properties.Resources.Logo8bpp); pti4.Column = 1; pti4.Row = 1; pti4.Dock = DockingType.Center; ptable.Add(pti4); } if (true) { GLFlowLayoutPanel pflow1 = new GLFlowLayoutPanel("flowlayout", new Rectangle(5, 400, 190, 190)); pflow1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pflow1.FlowPadding = new PaddingType(10, 5, 0, 0); pform.Add(pflow1); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted); pflow1.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(100, 0, 32, 32), Properties.Resources.dotted2); pflow1.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(100, 0, 48, 48), Properties.Resources.ImportSphere); pflow1.Add(pti3); GLImage pti4 = new GLImage("PTI4", new Rectangle(100, 0, 64, 64), Properties.Resources.Logo8bpp); pflow1.Add(pti4); } if (true) { GLScrollPanel sp1 = new GLScrollPanel("VSP1", new Rectangle(5, 600, 200, 200)); sp1.BorderWidth = 1; sp1.BackColor = Color.Yellow; // sp1.SetMarginBorderWidth(new Margin(2), 1, Color.Black, new GLOFC.GL4.Controls.Padding(2)); pform.Add(sp1); GLImage sp1i1 = new GLImage("SP1I1", new Rectangle(0, 0, 190, 100), Properties.Resources.dotted); sp1.Add(sp1i1); GLImage sp1i2 = new GLImage("SP1I22", new Rectangle(10, 150, 100, 100), Properties.Resources.dotted); sp1.Add(sp1i2); GLImage sp1i3 = new GLImage("SP1I23", new Rectangle(100, 100, 200, 200), Properties.Resources.dotted2); sp1.Add(sp1i3); sp1.VertScrollPos = 0; sp1.HorzScrollPos = 0; GLScrollBar sb1 = new GLScrollBar("SB1", new Rectangle(220, 600, 20, 100), 0, 200); sb1.Scroll += (c, s1e) => sp1.VertScrollPos = s1e.NewValue; pform.Add(sb1); GLScrollBar sb2 = new GLScrollBar("SB2", new Rectangle(260, 600, 100, 20), 0, 200); sb2.HorizontalScroll = true; sb2.Scroll += (c, s1e) => sp1.HorzScrollPos = s1e.NewValue; pform.Add(sb2); } int col2 = 200; if (true) { GLScrollPanelScrollBar spb1 = new GLScrollPanelScrollBar("CSPan", new Rectangle(col2, 5, 190, 190)); spb1.ScrollBackColor = Color.Yellow; spb1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pform.Add(spb1); GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i1); GLButton but = new GLButton("SPB1BUT1", new Rectangle(40, 120, 40, 20), "But1"); but.Click += (en, eb) => { System.Diagnostics.Debug.WriteLine("Click on SP Button"); }; spb1.Add(but); GLImage spb1i2 = new GLImage("SPB1I2", new Rectangle(10, 150, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i2); spb1.EnableHorzScrolling = false; } { GLButton but = new GLButton("ButExample", new Rectangle(40, 160, 40, 20), "But1"); but.Click += (en, eb) => { System.Diagnostics.Debug.WriteLine("Click on SP Button"); }; pform.Add(but); } int col3 = 400; if (true) { GLScrollPanelScrollBar spb1 = new GLScrollPanelScrollBar("CSPan2", new Rectangle(col3, 5, 190, 190)); spb1.ScrollBackColor = Color.Blue; spb1.ScrollBarTheme.ThumbButtonColor = Color.Red; spb1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pform.Add(spb1); GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i1); GLImage spb1i2 = new GLImage("SPB1I2", new Rectangle(10, 120, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i2); GLImage spb1i3 = new GLImage("SPB1I3", new Rectangle(150, 50, 100, 100), Properties.Resources.dotted2); spb1.Add(spb1i3); } if (true) { //GLGroupBox p3 = new GLGroupBox("GB1", "Group Box Very Long Title", new Rectangle(col2,200,190,190)); GLGroupBox p3 = new GLGroupBox("GB1", "Group Box", new Rectangle(col2, 200, 190, 190)); p3.TextAlign = ContentAlignment.MiddleRight; p3.AutoSize = true; GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); p3.Add(spb1i1); pform.Add(p3); } if (true) { GLTabControl tc = new GLTabControl("Tabc", new Rectangle(col2, 400, 200, 190)); tc.TabNotSelectedColor = Color.Yellow; tc.TabSelectedColor = Color.Red; tc.TabStyle = new TabStyleRoundedEdge(); //tc.TabStyle = new TabStyleSquare(); //tc.TabStyle = new TabStyleAngled(); tc.Font = new Font("Ms Sans Serif", 9); GLTabPage tabp1 = new GLTabPage("tabp1", "TAB 1", Color.Blue); tc.Add(tabp1); GLButton tabp1b1 = new GLButton("B1", new Rectangle(5, 5, 80, 40), "Button 1"); tabp1.Add(tabp1b1); tabp1b1.Click += (c, ev) => { System.Diagnostics.Debug.WriteLine("On click for " + c.Name + " " + ev.Button); }; tabp1b1.ToolTipText = "Button 1"; GLTabPage tabp2 = new GLTabPage("tabp2", "TAB Page 2", Color.Yellow); GLButton tabp2b1 = new GLButton("B2-2", new Rectangle(5, 25, 80, 40), "Button 2-2"); tabp2.Add(tabp2b1); tc.Add(tabp2); GLTabPage tabp3 = new GLTabPage("tabp3", "TAB Page 3", Color.Green); tc.Add(tabp3); GLTabPage tabp4 = new GLTabPage("tabp4", "TAB Page 4", Color.Magenta); tc.Add(tabp4); pform.Add(tc); // tc.SelectedTab = 0; GLButton tabselnone = new GLButton("BTSN", new Rectangle(col2 + 200 + 5, 400, 40, 15), "None"); tabselnone.Click += (c12, ev2) => { tc.SelectedTab = -1; }; pform.Add(tabselnone); } if (true) { GLPanel pouter = new GLPanel("outerflow", new Rectangle(col3, 200, 1300, 30)); // make it very wide, so the child has all the width it wants to flow into pouter.SetMarginBorderWidth(new MarginType(5), 1, Color.Blue, new PaddingType(5)); pouter.AutoSize = true; GLFlowLayoutPanel pflow2; pflow2 = new GLFlowLayoutPanel("Flowlayout2", new Rectangle(0, 0, 10, 10)); pflow2.AutoSize = true; pflow2.Margin = new MarginType(2); pflow2.Padding = new PaddingType(2); pflow2.BorderWidth = 1; pflow2.FlowPadding = new PaddingType(10, 5, 0, 5); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted2); pflow2.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(0, 0, 32, 32), Properties.Resources.dotted2); pflow2.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(0, 0, 48, 48), Properties.Resources.ImportSphere); pflow2.Add(pti3); for (int i = 0; i < 5; i++) { GLImage pti4 = new GLImage("PTI00" + i, new Rectangle(0, 0, 64, 64), Properties.Resources.Logo8bpp); pflow2.Add(pti4); } pouter.Add(pflow2); pform.Add(pouter); } { GLToolTip tip = new GLToolTip("ToolTip"); displaycontrol.Add(tip); } gl3dcontroller = new Controller3D(); gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = Controller3dDraw; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 10.0f); }; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; if (displaycontrol != null) { gl3dcontroller.Start(mc, displaycontrol, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); // HOOK the 3dcontroller to the form so it gets Form events displaycontrol.Paint += (o, ts) => // subscribing after start means we paint over the scene, letting transparency work { //System.Diagnostics.Debug.WriteLine(ts + " Render"); displaycontrol.Render(glwfc.RenderState, ts); // we use the same matrix calc as done in controller 3d draw }; } else { gl3dcontroller.Start(glwfc, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); // HOOK the 3dcontroller to the form so it gets Form events } systemtimer.Interval = 25; systemtimer.Tick += new EventHandler(SystemTick); systemtimer.Start(); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 500000f; gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.YHoldMovement = true; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 10.0f); }; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; gl3dcontroller.Start(glwfc, new Vector3(0, 0, -35000), new Vector3(126.75f, 0, 0), 0.31622F); int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; items.Add(new GLColorShaderWorld(), "COSW"); GLRenderState rl1 = GLRenderState.Lines(1); float h = -1; if (h != -1) { int dist = 1000; Color cr = Color.FromArgb(20, Color.Red); rObjects.Add(items.Shader("COS-1L"), // horizontal GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl1, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(left, h, back), new Vector3(dist, 0, 0), (back - front) / dist + 1), new Color4[] { cr }) ); rObjects.Add(items.Shader("COS-1L"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl1, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(right, h, front), new Vector3(0, 0, dist), (right - left) / dist + 1), new Color4[] { cr }) ); } { Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; items.Add(new GLFixedColorShaderWorld(System.Drawing.Color.Yellow), "LINEYELLOW"); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl1, displaylines)); } Bitmap[] numbitmaps = new Bitmap[116]; { Font fnt = new Font("Arial", 20); for (int i = 0; i < numbitmaps.Length; i++) { int v = -45000 + 1000 * i; // range from -45000 to +70000 numbitmaps[i] = new Bitmap(100, 100); GLOFC.Utils.BitMapHelpers.DrawTextCentreIntoBitmap(ref numbitmaps[i], v.ToString(), fnt, System.Drawing.Text.TextRenderingHint.ClearTypeGridFit, Color.Red, Color.AliceBlue); } GLTexture2DArray numtextures = new GLTexture2DArray(numbitmaps, SizedInternalFormat.Rgba8, ownbmp: true); items.Add(numtextures, "Nums"); Matrix4[] numberposx = new Matrix4[(right - left) / 1000 + 1]; for (int i = 0; i < numberposx.Length; i++) { numberposx[i] = Matrix4.CreateScale(1); numberposx[i] *= Matrix4.CreateRotationX(-25f.Radians()); numberposx[i] *= Matrix4.CreateTranslation(new Vector3(left + 1000 * i, 0, front)); } GLShaderPipeline numshaderx = new GLShaderPipeline(new GLPLVertexShaderModelMatrixTexture(), new GLPLFragmentShaderTexture2DIndexed(0)); items.Add(numshaderx, "IC-X"); GLRenderState rq = GLRenderState.Quads(cullface: false); GLRenderDataTexture rt = new GLRenderDataTexture(items.Tex("Nums")); rObjects.Add(numshaderx, "xnum", GLRenderableItem.CreateVector4Vector2Matrix4(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(500.0f), GLShapeObjectFactory.TexQuadCW, numberposx, rt, numberposx.Length)); Matrix4[] numberposz = new Matrix4[(back - front) / 1000 + 1]; for (int i = 0; i < numberposz.Length; i++) { numberposz[i] = Matrix4.CreateScale(1); numberposz[i] *= Matrix4.CreateRotationX(-25f.Radians()); numberposz[i] *= Matrix4.CreateTranslation(new Vector3(right + 1000, 0, front + 1000 * i)); } GLShaderPipeline numshaderz = new GLShaderPipeline(new GLPLVertexShaderModelMatrixTexture(), new GLPLFragmentShaderTexture2DIndexed(25)); items.Add(numshaderz, "IC-Z"); rObjects.Add(numshaderz, "ynum", GLRenderableItem.CreateVector4Vector2Matrix4(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(500.0f), GLShapeObjectFactory.TexQuadCW, numberposz, rt, numberposz.Length)); } { items.Add(new GLTexture2D(numbitmaps[45], SizedInternalFormat.Rgba8), "solmarker"); items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); GLRenderState rq = GLRenderState.Quads(cullface: false); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, 1000, 0)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("solmarker"), new Vector3(0, -1000, 0)) )); items.Add(new GLTexture2D(Properties.Resources.dotted, SizedInternalFormat.Rgba8), "sag"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, 2000, 25899)) )); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("sag"), new Vector3(25.2f, -2000, 25899)) )); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "bp"); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000.0f, 1000.0f, new Vector3(0, 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("bp"), new Vector3(-1111f, 0, 65269)) )); } boundingbox = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, vsize, front, 1), new Vector4(right, vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, vsize, back, 1), new Vector4(right, vsize, back, 1), new Vector4(right, -vsize, back, 1), }; if (true) { volumetricblock = new GLVolumetricUniformBlock(); items.Add(volumetricblock, "VB"); int sc = 1; GLTexture3D noise3d = new GLTexture3D(1024 * sc, 64 * sc, 1024 * sc, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(noise3d, "Noise"); ComputeShaderNoise3D csn = new ComputeShaderNoise3D(noise3d.Width, noise3d.Height, noise3d.Depth, 128 * sc, 16 * sc, 128 * sc); // must be a multiple of localgroupsize in csn csn.StartAction += (A, m) => { noise3d.BindImage(3); }; csn.Run(); // compute noise GLTexture1D gaussiantex = new GLTexture1D(1024, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(gaussiantex, "Gaussian"); // set centre=width, higher widths means more curve, higher std dev compensate ComputeShaderGaussian gsn = new ComputeShaderGaussian(gaussiantex.Width, 2.0f, 2.0f, 1.4f, 4); gsn.StartAction += (A, m) => { gaussiantex.BindImage(4); }; gsn.Run(); // compute noise GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits); float[] gdata = gaussiantex.GetTextureImageAs <float>(OpenTK.Graphics.OpenGL4.PixelFormat.Red); // read back check // load one upside down and horz flipped, because the volumetric co-ords are 0,0,0 bottom left, 1,1,1 top right GLTexture2D galtex = new GLTexture2D(Properties.Resources.Galaxy_L180, SizedInternalFormat.Rgba8); items.Add(galtex, "gal"); GalaxyShader gs = new GalaxyShader(); items.Add(gs, "Galaxy"); gs.StartAction += (a, m) => { galtex.Bind(1); noise3d.Bind(3); gaussiantex.Bind(4); }; GLRenderState rv = GLRenderState.Tri(); galaxy = GLRenderableItem.CreateNullVertex(PrimitiveType.Points, rv); // no vertexes, all data from bound volumetric uniform, no instances as yet rObjects.Add(items.Shader("Galaxy"), galaxy); } items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block }