public void CopyPixel(int destX, int destY, int srcX, int srcY, RenderBitmap src, float lightAmt) { int srcIndex = (srcY * src.m_width + srcX); unsafe { RGBColor *rgbColor = (RGBColor *)((byte *)(m_data.Scan0 + m_data.Stride * destY + destX * 4)); fixed(RGBColor *color = &src.m_components[srcIndex]) { rgbColor->r = (byte)(color->r * lightAmt); rgbColor->g = (byte)(color->g * lightAmt); rgbColor->b = (byte)(color->b * lightAmt); } } }
public void Draw(RenderContext context, Matrix viewProjection, Matrix transform, RenderBitmap texture) { Matrix mvp = viewProjection.Mul(transform); int n = m_indices.Count; Parallel.For(0, (n / 3), i => { int k = i * 3; var a = m_vertices[m_indices[k]].Transform(mvp, transform); var b = m_vertices[m_indices[k + 1]].Transform(mvp, transform); var c = m_vertices[m_indices[k + 2]].Transform(mvp, transform); context.DrawTriangle(a, b, c, texture); }); //for (int i = 0; i < n ; i = i + 3) //{ // var a = m_vertices[m_indices[i]].Transform(mvp, transform); // var b = m_vertices[m_indices[i + 1]].Transform(mvp, transform); // var c = m_vertices[m_indices[i + 2]].Transform(mvp, transform); // context.DrawTriangle(a, b, c, texture); //} }
private void MainForLoad(object sender, EventArgs e) { //m_Timer = new System.Timers.Timer(15); //m_Timer.Elapsed += OnTimer_Elapsed; //m_Timer.Start(); m_IsRunning = true; stopWatch.Start(); this.WindowState = FormWindowState.Maximized; this.target = new RenderContext(this.Width, this.Height); this.texture = new Lib.RenderBitmap("Resource/bricks.jpg"); this.texture2 = new Lib.RenderBitmap("Resource/bricks2.jpg"); this.monkeyMesh = new Mesh("Resource/monkey.obj"); this.monkeyTransform = new Transform(new Vector(0, 0.0f, 3.0f)); this.terrainMesh = new Mesh("Resource/terrain.obj"); this.terrainTransform = new Transform(new Vector(0, -1.0f, 0.0f)); this.input = new Input(); this.camera = new Camera(new Matrix().InitPerspective(Utils.ToRadians(70.0f), ((float)target.m_width / target.m_height), 0.1f, 1000.0f)); UpdateBitmapSize(); m_Thread = new System.Threading.Thread(() => { var sw = new Stopwatch(); long time = 0; long endTime = 0; long nextTime = 0; float fps = 0.0f; using (var gx = this.CreateGraphics()) { sw.Start(); while (m_IsRunning) { time = sw.ElapsedMilliseconds; if (time > nextTime) { nextTime = nextTime + 10; Draw(gx); } //m_Counter++; //if (m_Counter >= 15) //{ // endTime = sw.ElapsedMilliseconds; // this.BeginInvoke((Action)(() => // { // this.Text = fps.ToString(); // })); //} } } }); m_Thread.Start(); }