public OrderIndependentTransparencyRenderer(IBufferable model, vec3 lengths, string positionName, string normalName) { { var map = new AttributeMap(); map.Add("position", positionName); map.Add("normal", normalName); var build_lists = new ShaderCode[2]; build_lists[0] = new ShaderCode(File.ReadAllText(@"shaders\OIT\build_lists.vert"), ShaderType.VertexShader); build_lists[1] = new ShaderCode(File.ReadAllText(@"shaders\OIT\build_lists.frag"), ShaderType.FragmentShader); this.buildListsRenderer = new PickableRenderer(model, build_lists, map, positionName); } { var map = new AttributeMap(); map.Add("position", positionName); var resolve_lists = new ShaderCode[2]; resolve_lists[0] = new ShaderCode(File.ReadAllText(@"shaders\OIT\resolve_lists.vert"), ShaderType.VertexShader); resolve_lists[1] = new ShaderCode(File.ReadAllText(@"shaders\OIT\resolve_lists.frag"), ShaderType.FragmentShader); this.resolve_lists = new PickableRenderer(model, resolve_lists, map, positionName); } { this.depthTestSwitch = new DepthTestSwitch(false); this.cullFaceSwitch = new CullFaceSwitch(false); } this.Lengths = lengths; }
private void Form_Load(object sender, EventArgs e) { { var camera = new Camera( new vec3(0, 0, 5), new vec3(0, 0, 0), new vec3(0, 1, 0), CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); var rotator = new SatelliteManipulater(); rotator.Bind(camera, this.glCanvas1); this.camera = camera; this.rotator = rotator; } { IBufferable bufferable = new Teapot(); var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\Transparent.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\Transparent.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("in_Position", "position"); map.Add("in_Color", "color"); var renderer = new PickableRenderer(bufferable, shaderCodes, map, "position"); renderer.Name = "Order-Dependent Transparent Renderer"; renderer.Initialize(); { GLSwitch blendSwitch = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha); renderer.SwitchList.Add(blendSwitch); } this.renderer = renderer; } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.renderer); frmPropertyGrid.Show(); this.formPropertyGrid = frmPropertyGrid; } }
public OrderIndependentTransparencyRenderer(IBufferable model, vec3 lengths, string positionName, string normalName) { { var map = new AttributeMap(); map.Add("position", positionName); map.Add("normal", normalName); var build_lists = new ShaderCode[2]; build_lists[0] = new ShaderCode(File.ReadAllText(@"shaders\OIT\build_lists.vert"), ShaderType.VertexShader); build_lists[1] = new ShaderCode(File.ReadAllText(@"shaders\OIT\build_lists.frag"), ShaderType.FragmentShader); this.buildListsRenderer = new PickableRenderer(model, build_lists, map, positionName); } { var map = new AttributeMap(); map.Add("position", positionName); var resolve_lists = new ShaderCode[2]; resolve_lists[0] = new ShaderCode(File.ReadAllText(@"shaders\OIT\resolve_lists.vert"), ShaderType.VertexShader); resolve_lists[1] = new ShaderCode(File.ReadAllText(@"shaders\OIT\resolve_lists.frag"), ShaderType.FragmentShader); this.resolve_lists = new PickableRenderer(model, resolve_lists, map, positionName); } { this.depthTestState = new DepthTestState(false); this.cullFaceState = new CullFaceState(false); } this.ModelSize = lengths; }
private void Form02OrderIndependentTransparency_Load(object sender, EventArgs e) { { var camera = new Camera( new vec3(0, 0, 5), new vec3(0, 0, 0), new vec3(0, 1, 0), CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); var rotator = new SatelliteRotator(camera); this.camera = camera; this.rotator = rotator; } { IBufferable bufferable = new Teapot(); var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"03OrderDependentTransparency\Transparent.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"03OrderDependentTransparency\Transparent.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("in_Position", "position"); map.Add("in_Color", "color"); var renderer = new PickableRenderer(bufferable, shaderCodes, map, "position"); renderer.Name = "Order-Dependent Transparent Renderer"; renderer.Initialize(); { GLSwitch blendSwitch = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha); renderer.SwitchList.Add(blendSwitch); } this.renderer = renderer; } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.renderer); frmPropertyGrid.Show(); this.formPropertyGrid = frmPropertyGrid; } }
private void Form02OrderIndependentTransparency_Load(object sender, EventArgs e) { { var camera = new Camera(CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); camera.Position = new vec3(0, 0, 5); camera.Target = new vec3(0, 0, 0); camera.UpVector = new vec3(0, 1, 0); var rotator = new SatelliteRotator(camera); this.camera = camera; this.rotator = rotator; } { var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"12Billboard\Cube.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"12Billboard\Cube.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("in_Position", "position"); map.Add("in_Color", "color"); var cubeRenderer = new PickableRenderer(new Cube(), shaderCodes, map, "position"); cubeRenderer.Initialize(); this.cubeRenderer = cubeRenderer; } { var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"12Billboard\billboard.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"12Billboard\billboard.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("squareVertices", "position"); var billboardRenderer = new Renderer(new BillboardModel(), shaderCodes, map); billboardRenderer.Initialize(); var texture = new sampler2D(); var bitmap = new Bitmap(@"12Billboard\ExampleBillboard.png"); texture.Initialize(bitmap); bitmap.Dispose(); billboardRenderer.SetUniform("myTextureSampler", new samplerValue(BindTextureTarget.Texture2D, texture.Id, OpenGL.GL_TEXTURE0)); this.billboardRenderer = billboardRenderer; } { var UIRoot = new GLControl(this.glCanvas1.Size, -100, 100); UIRoot.Initialize(); this.uiRoot = UIRoot; var glAxis = new GLAxis(AnchorStyles.Right | AnchorStyles.Bottom, new Padding(3, 3, 3, 3), new Size(70, 70), -100, 100); glAxis.Initialize(); this.glAxis = glAxis; UIRoot.Controls.Add(glAxis); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.glAxis); frmPropertyGrid.Show(); this.formPropertyGrid = frmPropertyGrid; } }
private void glCanvas1_MouseMove(object sender, MouseEventArgs e) { if (lastMousePosition == e.Location) { return; } if (e.Button == System.Windows.Forms.MouseButtons.Right) { //// operate camera //rotator.MouseMove(e.X, e.Y); } else if (e.Button == System.Windows.Forms.MouseButtons.Left) { // move vertex DragParam dragParam = this.dragParam; if (dragParam != null) { var current = new Point(e.X, glCanvas1.Height - e.Y - 1); Point differenceOnScreen = new Point( current.X - dragParam.lastMousePositionOnScreen.X, current.Y - dragParam.lastMousePositionOnScreen.Y); dragParam.lastMousePositionOnScreen = current; PickableRenderer renderer = null; { var tmp = this.pickedGeometry.FromRenderer as HighlightedPickableRenderer; if (tmp != null) { renderer = tmp.PickableRenderer; } } if (renderer == null) { renderer = this.pickedGeometry.FromRenderer as PickableRenderer; } renderer.MovePositions( differenceOnScreen, dragParam.viewMatrix, dragParam.projectionMatrix, dragParam.viewport, dragParam.pickedVertexIds); } } else { MouseMoveFree(e); } UpdateColorInformationAtMouse(e.X, e.Y); this.lastMousePosition = e.Location; }
private void ControlDown(MouseEventArgs e) { List <Tuple <Point, PickedGeometry> > allPickedGeometrys = this.scene.Pick( e.Location, this.PickingGeometryType); PickedGeometry pickedGeometry = null; if (allPickedGeometrys != null && allPickedGeometrys.Count > 0) { pickedGeometry = allPickedGeometrys[0].Item2; } if (pickedGeometry != null) { PickableRenderer pickableRenderer = null; var renderer = pickedGeometry.FromRenderer as HighlightedPickableRenderer; if (renderer != null) { renderer.Highlighter.SetHighlightIndexes( this.PickingGeometryType.ToDrawMode(), pickedGeometry.VertexIds); this.highlightedRenderer = renderer; pickableRenderer = renderer.PickableRenderer; } else { pickableRenderer = pickedGeometry.FromRenderer as PickableRenderer; } FormBulletinBoard bulletinBoard = this.bulletinBoard; if ((bulletinBoard != null) && (!bulletinBoard.IsDisposed)) { ICamera camera = this.scene.FirstCamera; mat4 projection = camera.GetProjectionMatrix(); mat4 view = camera.GetViewMatrix(); mat4 model = pickableRenderer.GetModelMatrix().Value; this.bulletinBoard.SetContent(pickedGeometry.ToString( projection, view, model)); } this.glCanvas1.Cursor = Cursors.Hand; } else { HighlightedPickableRenderer renderer = this.highlightedRenderer; if (renderer != null) { renderer.Highlighter.ClearHighlightIndexes(); } this.bulletinBoard.SetContent("picked nothing."); this.glCanvas1.Cursor = Cursors.Default; } this.pickedGeometry = pickedGeometry; }
private PickedGeometry RunPicking(RenderEventArgs arg, int x, int y) { lock (this.synObj) { // prepare pickable elements PickableRenderer pickable = this.rendererDict[this.SelectedModel].PickableRenderer; pickable.MVP = this.camera.GetProjectionMat4() * this.camera.GetViewMat4(); PickedGeometry pickedGeometry = ColorCodedPicking.Pick( arg, x, y, pickable); return(pickedGeometry); } }
/// <summary> /// 支持UI布局的渲染器 /// </summary> /// <param name="modernRenderer">要渲染的对象</param> /// <param name="Anchor">绑定到窗口的哪些边?</param> /// <param name="Margin">到绑定边的距离</param> /// <param name="Size">UI大小</param> /// <param name="zNear"></param> /// <param name="zFar"></param> public UIAxisRenderer( System.Windows.Forms.AnchorStyles Anchor, System.Windows.Forms.Padding Margin, System.Drawing.Size Size, int zNear = -1000, int zFar = 1000 ) : base(null, Anchor, Margin, Size, zNear, zFar) { ShaderCode[] shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.frag"), ShaderType.FragmentShader); var propertyNameMap = new PropertyNameMap(); propertyNameMap.Add("in_Position", "position"); propertyNameMap.Add("in_Color", "color"); PickableRenderer pickableRenderer = PickableRendererFactory.GetRenderer( new Axis(), shaderCodes, propertyNameMap, "position"); pickableRenderer.Name = string.Format("Pickable: [{0}]", "Axis"); pickableRenderer.Initialize(); { GLSwitch lineWidthSwitch = new LineWidthSwitch(10); pickableRenderer.SwitchList.Add(lineWidthSwitch); GLSwitch pointSizeSwitch = new PointSizeSwitch(10); pickableRenderer.SwitchList.Add(pointSizeSwitch); GLSwitch polygonModeSwitch = new PolygonModeSwitch(PolygonModes.Filled); pickableRenderer.SwitchList.Add(polygonModeSwitch); if (pickableRenderer is OneIndexRenderer) { GLSwitch primitiveRestartSwitch = new PrimitiveRestartSwitch((pickableRenderer as OneIndexRenderer).IndexBufferPtr); pickableRenderer.SwitchList.Add(primitiveRestartSwitch); } } this.renderer = pickableRenderer; this.textList.Add(new Tuple <vec3, string, Font, Color>(new vec3(offset, 0, 0), "X", new Font("Courier New", fontSize), Color.Red)); this.textList.Add(new Tuple <vec3, string, Font, Color>(new vec3(0, offset, 0), "Y", new Font("Courier New", fontSize), Color.Green)); this.textList.Add(new Tuple <vec3, string, Font, Color>(new vec3(0, 0, offset), "Z", new Font("Courier New", fontSize), Color.Blue)); }
/// <summary> /// 高亮显示拾取的图元。 /// </summary> /// <param name="highlighter"></param> /// <param name="pickableRenderer"></param> public HighlightedPickableRenderer(HighlightRenderer highlighter, PickableRenderer pickableRenderer) { this.Highlighter = highlighter; this.PickableRenderer = pickableRenderer; }
void FormMain_Load(object sender, EventArgs e) { { var camera = new Camera( new vec3(0, 0, (float)(Earth.revolutionRadius * 1.1)), new vec3(0, 0, 0), new vec3(0, 1, 0), CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); IPerspectiveViewCamera perspecitve = camera; perspecitve.Near = 1; perspecitve.Far = Earth.revolutionRadius * 5; var rotator = new SatelliteRotator(camera); this.camera = camera; this.rotator = rotator; } { const int latitude = 180; //从南到北,纬度共有180° const int hour = 24; //24小时,24个时区 const int longitudePerHour = 15; // 每个时区占有的经度为15° const int longitude = hour * longitudePerHour; // 从东到西,经度共有360° IBufferable bufferable = new CelestialBody(1, latitude, longitude); var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\CelestialBody.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\CelestialBody.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("inPosition", CelestialBody.strPosition); map.Add("inUV", CelestialBody.strUV); var earthRenderer = new PickableRenderer(bufferable, shaderCodes, map, CelestialBody.strPosition); earthRenderer.Initialize(); earthRenderer.Name = "Earth 地球"; this.earthRenderer = earthRenderer; } { // Ecliptic: 黄道 IBufferable bufferable = new Circle((float)Earth.revolutionRadius); var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\Circle.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\Circle.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("inPosition", Circle.strPosition); var eclipticRenderer = new Renderer(bufferable, shaderCodes, map); eclipticRenderer.Initialize(); eclipticRenderer.Name = "Ecliptic 黄道"; this.eclipticRenderer = eclipticRenderer; } { const int latitude = 180; //从南到北,纬度共有180° const int hour = 24; //24小时,24个时区 const int longitudePerHour = 15; // 每个时区占有的经度为15° const int longitude = hour * longitudePerHour; // 从东到西,经度共有360° IBufferable bufferable = new CelestialBody((float)Sun.radius, latitude, longitude); var shaderCodes = new ShaderCode[2]; shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\Sun.vert"), ShaderType.VertexShader); shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\Sun.frag"), ShaderType.FragmentShader); var map = new PropertyNameMap(); map.Add("inPosition", CelestialBody.strPosition); var sunRenderer = new PickableRenderer(bufferable, shaderCodes, map, CelestialBody.strPosition); sunRenderer.Initialize(); sunRenderer.Name = "Sun 太阳"; this.sunRenderer = sunRenderer; } { var sunshineRenderer = new SunshineRenderer(); this.sunshineRenderer = sunshineRenderer; } { var backgroundStars = new BackgroundStarsRenderer(2000, Earth.revolutionRadius); backgroundStars.Initialize(); backgroundStars.Name = "stars 星星"; this.backgroundStars = backgroundStars; } { var glAxis = new GLAxis(AnchorStyles.Left | AnchorStyles.Bottom, new Padding(5, 5, 5, 5), new Size(100, 100), -100, 100); glAxis.Initialize(); this.glAxis = glAxis; } { var uiRoot = new GLControl(this.glCanvas1.Size, -100, 100); uiRoot.Initialize(); this.uiRoot = uiRoot; } { this.uiRoot.Controls.Add(this.glAxis); } { var earthColorTexture = new sampler2D(); var bitmap = new Bitmap(@"Images\earth-color-map-10800-5400.jpg"); earthColorTexture.Initialize(bitmap); bitmap.Dispose(); this.earthColorTexture = earthColorTexture; } { this.eclipticRenderer.SetUniform("color", new vec4(1.0f, 1.0f, 0.0f, 0.1f)); this.eclipticRenderer.SwitchList.Add(new PolygonModeSwitch(PolygonModes.Points)); } { this.earthRenderer.SetUniform("colorTexture", new samplerValue(BindTextureTarget.Texture2D, this.earthColorTexture.Id, OpenGL.GL_TEXTURE0)); //this.earthRenderer.SwitchList.Add(new CullFaceSwitch()); //this.sunRenderer.SwitchList.Add(new CullFaceSwitch()); } { var earth = new Earth(); this.earth = earth; this.thingList.Add(earth); } { var sun = new Sun(); this.sun = sun; this.thingList.Add(sun); } { var tracer = new CameraTracer(this.camera, this.earth, this.sun); this.tracer = tracer; this.thingList.Add(tracer); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this); frmPropertyGrid.Show(); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.earthRenderer); frmPropertyGrid.Show(); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.sunRenderer); frmPropertyGrid.Show(); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.eclipticRenderer); frmPropertyGrid.Show(); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.tracer); frmPropertyGrid.Show(); } { this.TimeSpeed = 14400; } }
protected override void DoInitialize() { { var computeProgram = new ShaderProgram(); var shaderCode = new ShaderCode(File.ReadAllText( @"06ImageProcessing\ImageProcessing.comp"), ShaderType.ComputeShader); var shader = shaderCode.CreateShader(); computeProgram.Create(shader); shader.Delete(); this.computeProgram = computeProgram; } { Bitmap bitmap = new System.Drawing.Bitmap(this.textureFilename); if (bitmap.Width != 512 || bitmap.Height != 512) { bitmap = (Bitmap)bitmap.GetThumbnailImage(512, 512, null, IntPtr.Zero); } OpenGL.GenTextures(1, this.input_image); OpenGL.BindTexture(OpenGL.GL_TEXTURE_2D, this.input_image[0]); // Lock the image bits (so that we can pass them to OGL). BitmapData bitmapData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); //GL.ActiveTexture(GL.GL_TEXTURE0); OpenGL.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA32F, bitmap.Width, bitmap.Height, 0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, bitmapData.Scan0); // Unlock the image. bitmap.UnlockBits(bitmapData); /* We require 1 byte alignment when uploading texture data */ //GL.PixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); /* Clamping to edges is important to prevent artifacts when scaling */ OpenGL.TexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, (int)OpenGL.GL_CLAMP_TO_EDGE); OpenGL.TexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, (int)OpenGL.GL_CLAMP_TO_EDGE); /* Linear filtering usually looks best for text */ OpenGL.TexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, (int)OpenGL.GL_LINEAR); OpenGL.TexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, (int)OpenGL.GL_LINEAR); bitmap.Dispose(); } { //GL.ActiveTexture(GL.GL_TEXTURE0); OpenGL.GenTextures(1, this.intermediate_image); OpenGL.BindTexture(OpenGL.GL_TEXTURE_2D, this.intermediate_image[0]); OpenGL.TexStorage2D(TexStorage2DTarget.Texture2D, 8, OpenGL.GL_RGBA32F, 512, 512); } { // This is the texture that the compute program will write into //GL.ActiveTexture(GL.GL_TEXTURE0); OpenGL.GenTextures(1, this.output_image); OpenGL.BindTexture(OpenGL.GL_TEXTURE_2D, this.output_image[0]); OpenGL.TexStorage2D(TexStorage2DTarget.Texture2D, 8, OpenGL.GL_RGBA32F, 512, 512); } { var bufferable = new ImageProcessingModel(); ShaderCode[] simpleShader = new ShaderCode[2]; simpleShader[0] = new ShaderCode(File.ReadAllText(@"06ImageProcessing\ImageProcessing.vert"), ShaderType.VertexShader); simpleShader[1] = new ShaderCode(File.ReadAllText(@"06ImageProcessing\ImageProcessing.frag"), ShaderType.FragmentShader); var propertyNameMap = new PropertyNameMap(); propertyNameMap.Add("vert", "position"); propertyNameMap.Add("uv", "uv"); var pickableRenderer = new PickableRenderer( bufferable, simpleShader, propertyNameMap, "position"); pickableRenderer.Name = string.Format("Pickable: [ImageProcessingRenderer]"); pickableRenderer.Initialize(); pickableRenderer.SetUniform("output_image", new samplerValue( BindTextureTarget.Texture2D, this.output_image[0], OpenGL.GL_TEXTURE0)); this.renderer = pickableRenderer; } }
private void Form01Renderer_Load(object sender, EventArgs e) { { var camera = new Camera(CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); camera.Position = new vec3(0, 0, 5); var rotator = new SatelliteRotator(camera); this.camera = camera; this.rotator = rotator; } { // build several models Random random = new Random(); var bufferables = new IBufferable[] { new Axis(), new BigDipper(), new Chain(new ChainModel(random.Next(7, 100), 5, 5)), new Tetrahedron(), new Cube(), new Sphere(), new Teapot(), }; var keys = new GeometryModel[] { GeometryModel.Axis, GeometryModel.BigDipper, GeometryModel.Chain, GeometryModel.Tetrahedron, GeometryModel.Cube, GeometryModel.Sphere, GeometryModel.Teapot, }; ShaderCode[] simpleShader = new ShaderCode[2]; simpleShader[0] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.vert"), ShaderType.VertexShader); simpleShader[1] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.frag"), ShaderType.FragmentShader); ShaderCode[] emitNormalLineShader = new ShaderCode[3]; emitNormalLineShader[0] = new ShaderCode(File.ReadAllText(@"01Renderer\EmitNormalLine.vert"), ShaderType.VertexShader); emitNormalLineShader[1] = new ShaderCode(File.ReadAllText(@"01Renderer\EmitNormalLine.geom"), ShaderType.GeometryShader); emitNormalLineShader[2] = new ShaderCode(File.ReadAllText(@"01Renderer\EmitNormalLine.frag"), ShaderType.FragmentShader); var shaderCodesGroup = new ShaderCode[][] { simpleShader, simpleShader, simpleShader, emitNormalLineShader, emitNormalLineShader, emitNormalLineShader, emitNormalLineShader, }; var simpleShaderPropertyNameMap = new PropertyNameMap(); simpleShaderPropertyNameMap.Add("in_Position", "position"); simpleShaderPropertyNameMap.Add("in_Color", "color"); var emitNormalLineShaderPropertyNameMap = new PropertyNameMap(); emitNormalLineShaderPropertyNameMap.Add("in_Position", "position"); emitNormalLineShaderPropertyNameMap.Add("in_Normal", "normal"); var propertyNameMaps = new PropertyNameMap[] { simpleShaderPropertyNameMap, simpleShaderPropertyNameMap, simpleShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, }; var positionNameInIBufferables = new string[] { "position", "position", "position", "position", "position", "position", "position", }; var uniformTupleList = new List <Tuple <string, ValueType> >() { new Tuple <string, ValueType>("normalLength", 0.5f), new Tuple <string, ValueType>("showModel", true), new Tuple <string, ValueType>("showNormal", false), }; var uniformVariablesList = new List <List <Tuple <string, ValueType> > >() { new List <Tuple <string, ValueType> >(), new List <Tuple <string, ValueType> >(), new List <Tuple <string, ValueType> >(), uniformTupleList, uniformTupleList, uniformTupleList, uniformTupleList, }; for (int i = 0; i < bufferables.Length; i++) { GeometryModel key = keys[i]; IBufferable bufferable = bufferables[i]; ShaderCode[] shaders = shaderCodesGroup[i]; var propertyNameMap = propertyNameMaps[i]; string positionNameInIBufferable = positionNameInIBufferables[i]; var highlightRenderer = new HighlightRenderer( bufferable, positionNameInIBufferable); highlightRenderer.Name = string.Format("Highlight: [{0}]", key); highlightRenderer.Initialize(); var pickableRenderer = new PickableRenderer( bufferable, shaders, propertyNameMap, positionNameInIBufferable); pickableRenderer.Name = string.Format("Pickable: [{0}]", key); pickableRenderer.Initialize(); var uniformVariables = uniformVariablesList[i]; foreach (var item in uniformVariables) { pickableRenderer.SetUniform(item.Item1, item.Item2); } HighlightedPickableRenderer renderer = new HighlightedPickableRenderer( highlightRenderer, pickableRenderer); renderer.Initialize(); { GLSwitch lineWidthSwitch = new LineWidthSwitch(5); pickableRenderer.SwitchList.Add(lineWidthSwitch); GLSwitch pointSizeSwitch = new PointSizeSwitch(10); pickableRenderer.SwitchList.Add(pointSizeSwitch); GLSwitch polygonModeSwitch = new PolygonModeSwitch(PolygonModes.Filled); pickableRenderer.SwitchList.Add(polygonModeSwitch); //GLSwitch blendSwitch = new BlendSwitch(); //pickableRenderer.SwitchList.Add(blendSwitch); } this.rendererDict.Add(key, renderer); } this.SelectedModel = GeometryModel.Tetrahedron; } { // build the axis var bufferables = new IBufferable[] { new Axis(), }; var keys = new GeometryModel[] { GeometryModel.Axis, }; ShaderCode[] simpleShader = new ShaderCode[2]; simpleShader[0] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.vert"), ShaderType.VertexShader); simpleShader[1] = new ShaderCode(File.ReadAllText(@"01Renderer\Simple.frag"), ShaderType.FragmentShader); var shaderCodesGroup = new ShaderCode[][] { simpleShader, }; var simpleShaderPropertyNameMap = new PropertyNameMap(); simpleShaderPropertyNameMap.Add("in_Position", "position"); simpleShaderPropertyNameMap.Add("in_Color", "color"); var propertyNameMaps = new PropertyNameMap[] { simpleShaderPropertyNameMap, }; var positionNameInIBufferables = new string[] { "position", }; var uniformVariablesList = new List <List <Tuple <string, ValueType> > >() { new List <Tuple <string, ValueType> >(), }; for (int i = 0; i < bufferables.Length; i++) { GeometryModel key = keys[i]; IBufferable bufferable = bufferables[i]; ShaderCode[] shaders = shaderCodesGroup[i]; var propertyNameMap = propertyNameMaps[i]; string positionNameInIBufferable = positionNameInIBufferables[i]; var pickableRenderer = new PickableRenderer( bufferable, shaders, propertyNameMap, positionNameInIBufferable); pickableRenderer.Name = string.Format("Pickable: [{0}]", key); pickableRenderer.Initialize(); var uniformVariables = uniformVariablesList[i]; foreach (var item in uniformVariables) { pickableRenderer.SetUniform(item.Item1, item.Item2); } } } { var frmBulletinBoard = new FormBulletinBoard(); //frmBulletinBoard.Dump = true; frmBulletinBoard.Show(); this.pickedGeometryBoard = frmBulletinBoard; } { var UIRoot = new GLControl(this.glCanvas1.Size, -100, 100); UIRoot.Initialize(); this.uiRoot = UIRoot; var glAxis = new GLAxis(AnchorStyles.Right | AnchorStyles.Bottom, new Padding(3, 3, 3, 3), new Size(70, 70), -100, 100); glAxis.Initialize(); this.glAxis = glAxis; UIRoot.Controls.Add(glAxis); } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.rendererDict[this.SelectedModel].PickableRenderer); frmPropertyGrid.Show(); this.pickableRendererPropertyGrid = frmPropertyGrid; } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this.rendererDict[this.SelectedModel].Highlighter); frmPropertyGrid.Show(); this.highlightRendererPropertyGrid = frmPropertyGrid; } { var frmPropertyGrid = new FormProperyGrid(); frmPropertyGrid.DisplayObject(this); frmPropertyGrid.Show(); this.formPropertyGrid = frmPropertyGrid; } { var frmIndexBufferPtrBoard = new FormIndexBufferPtrBoard(); frmIndexBufferPtrBoard.SetTarget(this.rendererDict[this.SelectedModel].PickableRenderer.IndexBufferPtr); frmIndexBufferPtrBoard.Show(); this.frmIndexBufferPtrBoard = frmIndexBufferPtrBoard; } }
private void glCanvas1_MouseMove(object sender, MouseEventArgs e) { if (lastMousePosition == e.Location) { return; } if (e.Button == System.Windows.Forms.MouseButtons.Right) { //// operate camera //rotator.MouseMove(e.X, e.Y); } else if (e.Button == System.Windows.Forms.MouseButtons.Left) { // move vertex DragParam dragParam = this.dragParam; if (dragParam != null) { var current = new Point(e.X, glCanvas1.Height - e.Y - 1); Point differenceOnScreen = new Point( current.X - dragParam.lastMousePositionOnScreen.X, current.Y - dragParam.lastMousePositionOnScreen.Y); dragParam.lastMousePositionOnScreen = current; PickableRenderer renderer = null; { var tmp = this.pickedGeometry.From as HighlightedPickableRenderer; if (tmp != null) { renderer = tmp.PickableRenderer; } } if (renderer == null) { renderer = this.pickedGeometry.From as PickableRenderer; } renderer.MovePositions( differenceOnScreen, dragParam.viewMatrix, dragParam.projectionMatrix, dragParam.viewport, dragParam.pickedVertexIds); } } else { UpdateColorInformationAtMouse(e.X, e.Y); PickedGeometry pickedGeometry = this.scene.ColorCodedPicking( e.Location, this.PickingGeometryType); if (pickedGeometry != null) { PickableRenderer pickableRenderer = null; var renderer = pickedGeometry.From as HighlightedPickableRenderer; if (renderer != null) { renderer.Highlighter.SetHighlightIndexes( this.PickingGeometryType.ToDrawMode(), pickedGeometry.VertexIds); this.highlightedRenderer = renderer; pickableRenderer = renderer.PickableRenderer; } else { pickableRenderer = pickedGeometry.From as PickableRenderer; } FormBulletinBoard bulletinBoard = this.bulletinBoard; if ((bulletinBoard != null) && (!bulletinBoard.IsDisposed)) { ICamera camera = this.scene.Camera; mat4 projection = camera.GetProjectionMatrix(); mat4 view = camera.GetViewMatrix(); mat4 model = pickableRenderer.GetModelMatrix(); this.bulletinBoard.SetContent(pickedGeometry.ToString( projection, view, model)); } this.glCanvas1.Cursor = Cursors.Hand; } else { HighlightedPickableRenderer renderer = this.highlightedRenderer; if (renderer != null) { renderer.Highlighter.ClearHighlightIndexes(); } this.bulletinBoard.SetContent("picked nothing."); this.glCanvas1.Cursor = Cursors.Default; } this.pickedGeometry = pickedGeometry; } this.lastMousePosition = e.Location; }
private void Form_Load(object sender, EventArgs e) { foreach (var item in Enum.GetValues(typeof(GeometryType))) { this.cmbPickingGeometryType.Items.Add(item); } foreach (var item in Enum.GetValues(typeof(RenderModes))) { this.cmbRenderMode.Items.Add(item); } { var frmBulletinBoard = new FormBulletinBoard(); //frmBulletinBoard.Dump = true; frmBulletinBoard.Show(); this.bulletinBoard = frmBulletinBoard; } { //this.glCanvas1.ShowSystemCursor = false; } { var camera = new Camera( new vec3(15, 5, 0), new vec3(0, 0, 0), new vec3(0, 1, 0), CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); var rotator = new FirstPerspectiveManipulater(); rotator.StepLength = 0.5f; rotator.Bind(camera, this.glCanvas1); var scene = new Scene(camera, this.glCanvas1); //scene.Cursor.Enabled = false; this.scene = scene; this.glCanvas1.Resize += scene.Resize; } { var uiAxis = new UIAxis(AnchorStyles.Left | AnchorStyles.Bottom, new Padding(3, 3, 3, 3), new Size(128, 128)); uiAxis.Initialize(); this.scene.UIRoot.Children.Add(uiAxis); } { var font = new Font("Courier New", 32); var uiText = new UIText(AnchorStyles.Left | AnchorStyles.Bottom, new Padding(0, 0, 0, 0), new Size(250, 20), -100, 100, font.GetFontBitmap("[index: 0123456789]").GetFontTexture()); uiText.Text = ""; this.uiText = uiText; this.scene.UIRoot.Children.Add(uiText); } { GroundRenderer ground = GroundRenderer.Create(new GroundModel(20)); ground.Initialize(); ground.Scale = new vec3(20, 20, 20); ground.WorldPosition = new vec3(0, 0, 0); SceneObject obj = ground.WrapToSceneObject(name: "Ground", generateBoundingBox: true); this.scene.RootObject.Children.Add(obj); } { bool useHighlightedPickingEffect = false; if (MessageBox.Show("Use highlighted picking effect?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { useHighlightedPickingEffect = true; } List <PickableRenderer> list = GetPickableRenderers(); const float distance = 10; float sideCount = (float)Math.Sqrt(list.Count); int sideCounti = (int)sideCount; float x = -sideCount * distance / 2; float z = -sideCount * distance / 2; //float x = 0, z = 0; for (int i = 0; i < list.Count; i++) { PickableRenderer item = list[i]; SceneObject obj; if (useHighlightedPickingEffect) { var model = item.Model; var highlightRenderer = new HighlightRenderer(model, item.PositionNameInIBufferable); var renderer = new HighlightedPickableRenderer( highlightRenderer, item); renderer.WorldPosition = new vec3(x, 2, z); renderer.Initialize(); obj = renderer.WrapToSceneObject(generateBoundingBox: true); } else { item.WorldPosition = new vec3(x, 2, z); obj = item.WrapToSceneObject(generateBoundingBox: true); } this.scene.RootObject.Children.Add(obj); x += distance; if (i % sideCounti == sideCounti - 1) { z += distance; x = -sideCount * distance / 2; } } } { this.glCanvas1.MouseDown += glCanvas1_MouseDown; this.glCanvas1.MouseMove += glCanvas1_MouseMove; this.glCanvas1.MouseUp += glCanvas1_MouseUp; } { var builder = new StringBuilder(); builder.AppendLine("1: Scene's property grid."); builder.AppendLine("2: Canvas' property grid."); builder.AppendLine("3: Form's property grid."); builder.AppendLine("4: Save to bitmap file."); MessageBox.Show(builder.ToString()); } }
private void Form_Load(object sender, EventArgs e) { { var camera = new Camera( new vec3(0, 0, 5), new vec3(), new vec3(0, 1, 0), CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height); var rotator = new SatelliteManipulater(); rotator.Bind(camera, this.glCanvas1); this.camera = camera; } { // build several models Random random = new Random(); var bufferables = new IBufferable[] { new Axis(), new BigDipper(), new Chain(new ChainModel(random.Next(7, 100), 5, 5)), new Tetrahedron(), new Cube(), new Sphere(), new Teapot(), }; var keys = new GeometryModel[] { GeometryModel.Axis, GeometryModel.BigDipper, GeometryModel.Chain, GeometryModel.Tetrahedron, GeometryModel.Cube, GeometryModel.Sphere, GeometryModel.Teapot, }; ShaderCode[] simpleShader = new ShaderCode[2]; simpleShader[0] = new ShaderCode(File.ReadAllText(@"shaders\Simple.vert"), ShaderType.VertexShader); simpleShader[1] = new ShaderCode(File.ReadAllText(@"shaders\Simple.frag"), ShaderType.FragmentShader); ShaderCode[] emitNormalLineShader = new ShaderCode[3]; emitNormalLineShader[0] = new ShaderCode(File.ReadAllText(@"shaders\EmitNormalLine.vert"), ShaderType.VertexShader); emitNormalLineShader[1] = new ShaderCode(File.ReadAllText(@"shaders\EmitNormalLine.geom"), ShaderType.GeometryShader); emitNormalLineShader[2] = new ShaderCode(File.ReadAllText(@"shaders\EmitNormalLine.frag"), ShaderType.FragmentShader); var shaderCodesGroup = new ShaderCode[][] { simpleShader, simpleShader, simpleShader, emitNormalLineShader, emitNormalLineShader, emitNormalLineShader, emitNormalLineShader, }; var simpleShaderPropertyNameMap = new PropertyNameMap(); simpleShaderPropertyNameMap.Add("in_Position", "position"); simpleShaderPropertyNameMap.Add("in_Color", "color"); var emitNormalLineShaderPropertyNameMap = new PropertyNameMap(); emitNormalLineShaderPropertyNameMap.Add("in_Position", "position"); emitNormalLineShaderPropertyNameMap.Add("in_Normal", "normal"); var propertyNameMaps = new PropertyNameMap[] { simpleShaderPropertyNameMap, simpleShaderPropertyNameMap, simpleShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, emitNormalLineShaderPropertyNameMap, }; var positionNameInIBufferables = new string[] { "position", "position", "position", "position", "position", "position", "position", }; for (int i = 0; i < bufferables.Length; i++) { GeometryModel key = keys[i]; IBufferable bufferable = bufferables[i]; ShaderCode[] shaders = shaderCodesGroup[i]; var propertyNameMap = propertyNameMaps[i]; string positionNameInIBufferable = positionNameInIBufferables[i]; var highlightRenderer = new HighlightRenderer( bufferable, positionNameInIBufferable); highlightRenderer.Name = string.Format("Highlight: [{0}]", key); highlightRenderer.Initialize(); var pickableRenderer = new PickableRenderer( bufferable, shaders, propertyNameMap, positionNameInIBufferable); pickableRenderer.Name = string.Format("Pickable: [{0}]", key); pickableRenderer.Initialize(); if (i > 2) { pickableRenderer.SetUniform("normalLength", 0.5f); pickableRenderer.SetUniform("showModel", true); pickableRenderer.SetUniform("showNormal", false); } HighlightedPickableRenderer renderer = new HighlightedPickableRenderer( highlightRenderer, pickableRenderer); renderer.Initialize(); { GLSwitch lineWidthSwitch = new LineWidthSwitch(5); pickableRenderer.SwitchList.Add(lineWidthSwitch); GLSwitch pointSizeSwitch = new PointSizeSwitch(10); pickableRenderer.SwitchList.Add(pointSizeSwitch); GLSwitch polygonModeSwitch = new PolygonModeSwitch(PolygonModes.Filled); pickableRenderer.SwitchList.Add(polygonModeSwitch); //GLSwitch blendSwitch = new BlendSwitch(); //pickableRenderer.SwitchList.Add(blendSwitch); } this.rendererDict.Add(key, renderer); } this.SelectedModel = GeometryModel.Tetrahedron; } { var frmBulletinBoard = new FormBulletinBoard(); //frmBulletinBoard.Dump = true; frmBulletinBoard.Show(); this.pickedGeometryBoard = frmBulletinBoard; } { var UIRoot = new UIRoot(); UIRoot.Initialize(); this.uiRoot = UIRoot; var uiAxis = new UIAxis(AnchorStyles.Left | AnchorStyles.Bottom, new Padding(3, 3, 3, 3), new Size(128, 128), -100, 100); uiAxis.Initialize(); UIRoot.Children.Add(uiAxis); this.uiAxis = uiAxis; var font = new Font("Courier New", 32); var uiText = new UIText(AnchorStyles.Left | AnchorStyles.Bottom, new Padding(0, 0, 0, 0), new Size(250, 20), -100, 100, font.GetFontBitmap("[index: 0123456789]").GetFontTexture()); uiText.Text = ""; uiRoot.Children.Add(uiText); this.uiText = uiText; } { var frmPropertyGrid = new FormProperyGrid(this.rendererDict[this.SelectedModel].PickableRenderer); frmPropertyGrid.Show(); this.pickableRendererPropertyGrid = frmPropertyGrid; } { var frmPropertyGrid = new FormProperyGrid(this.rendererDict[this.SelectedModel].Highlighter); frmPropertyGrid.Show(); this.highlightRendererPropertyGrid = frmPropertyGrid; } { var frmPropertyGrid = new FormProperyGrid(this); frmPropertyGrid.Show(); this.formPropertyGrid = frmPropertyGrid; } { var frmPropertyGrid = new FormProperyGrid(this.uiText); frmPropertyGrid.Show(); } { var frmIndexBufferPtrBoard = new FormIndexBufferPtrBoard(); frmIndexBufferPtrBoard.SetTarget(this.rendererDict[this.SelectedModel].PickableRenderer.IndexBufferPtr); frmIndexBufferPtrBoard.Show(); this.frmIndexBufferPtrBoard = frmIndexBufferPtrBoard; } }