private void FormMain_Load(object sender, EventArgs e) { var position = new vec3(5, 3, 4) * 2f; var center = new vec3(0, 0, 0); var up = new vec3(0, 1, 0); var camera = new Camera(position, center, up, CameraType.Perspecitive, this.winGLCanvas1.Width, this.winGLCanvas1.Height); this.scene = new Scene(camera); this.scene.ClearColor = Color.Black.ToVec4(); { var light = new PointLight(new vec3(1, 1, 1) * 30); this.scene.Lights.Add(light); } { var group = new GroupNode(); { var node = ParticleNode.Create(6000); group.Children.Add(node); } { string folder = System.Windows.Forms.Application.StartupPath; string filename = System.IO.Path.Combine(folder + @"\..\..\..\..\Infrastructure\CSharpGL.Models", "floor.obj_"); var parser = new ObjVNFParser(true); ObjVNFResult result = parser.Parse(filename); if (result.Error != null) { MessageBox.Show(result.Error.ToString()); } else { ObjVNFMesh mesh = result.Mesh; var model = new ObjVNF(mesh); var node = NoShadowNode.Create(model, ObjVNF.strPosition, ObjVNF.strNormal, model.GetSize()); node.WorldPosition = new vec3(0, -3, 0); node.Color = new vec3(0, 1, 0); node.Name = filename; group.Children.Add(node); } } this.scene.RootNode = group; } { var list = new ActionList(); var transformAction = new TransformAction(scene.RootNode); list.Add(transformAction); var renderAction = new RenderAction(scene); list.Add(renderAction); var blinnPhongAction = new BlinnPhongAction(scene); list.Add(blinnPhongAction); this.actionList = list; } var manipulater = new FirstPerspectiveManipulater(); manipulater.Bind(camera, this.winGLCanvas1); }
public static ParticleNode Create(int particleCount) { IShaderProgramProvider updateProvider, renderProvider; { var vs = new VertexShader(updateVert); var feedbackVaryings = new string[] { outPosition, outVelocity }; updateProvider = new ShaderArray(feedbackVaryings, ShaderProgram.BufferMode.Separate, vs); } { var vs = new VertexShader(renderVert); var gs = new GeometryShader(renderGeom); var fs = new FragmentShader(renderFrag); renderProvider = new ShaderArray(vs, gs, fs); } RenderMethodBuilder updateBuilder, updateBuilder2, renderBuilder, renderBuilder2; var blend = new BlendSwitch(BlendEquationMode.Add, BlendSrcFactor.One, BlendDestFactor.One); { var map = new AttributeMap(); map.Add(inPosition, ParticleModel.inPosition); map.Add(inVelocity, ParticleModel.inVelocity); updateBuilder = new RenderMethodBuilder(updateProvider, map); } { var map = new AttributeMap(); map.Add(inPosition, ParticleModel.inPosition2); map.Add(inVelocity, ParticleModel.inVelocity2); updateBuilder2 = new RenderMethodBuilder(updateProvider, map); } { var map = new AttributeMap(); map.Add(inPosition, ParticleModel.inPosition); map.Add(inVelocity, ParticleModel.inVelocity); renderBuilder = new RenderMethodBuilder(renderProvider, map, blend); } { var map = new AttributeMap(); map.Add(inPosition, ParticleModel.inPosition2); map.Add(inVelocity, ParticleModel.inVelocity2); renderBuilder2 = new RenderMethodBuilder(renderProvider, map, blend); } var model = new ParticleModel(particleCount); var node = new ParticleNode(model, updateBuilder, updateBuilder2, renderBuilder, renderBuilder2); node.Initialize(); return(node); }