Skip to content

Commit

Permalink
部分逻辑上传
Browse files Browse the repository at this point in the history
  • Loading branch information
YESshowMeCode committed May 5, 2019
1 parent 7e10aa3 commit 354c0fa
Show file tree
Hide file tree
Showing 24 changed files with 299 additions and 78 deletions.
Binary file modified SoftRender.v12.suo
Binary file not shown.
8 changes: 4 additions & 4 deletions SoftRender/Form1.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

245 changes: 232 additions & 13 deletions SoftRender/Form1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,27 @@ namespace SoftRender
public partial class SoftRender : Form
{

private Device mDevice;
private Bitmap mBmp;
private Rectangle mRect;
private Graphics mGraphics;
private Scene mScene;
private PixelFormat mPixelFormat;
private BitmapData mData;
private Device m_Device;
private Bitmap m_Bmp;
private Rectangle m_Rect;
private Graphics m_Graphics;
private Scene m_Scene;
private PixelFormat m_PixelFormat;
private BitmapData m_Data;

private Matrix mViewMat;
private Matrix mProjectionMat;
private Mesh mCube;
private bool mIsMouseLeftDown = false;
private Vector2 mMouseLeftPos = new Vector2();
private Matrix4x4 m_ViewMat;
private Matrix4x4 m_ProjectionMat;
private Mesh m_Cube;
private bool m_IsMouseLeftDown = false;
private Vector2 m_MouseLeftPos = new Vector2();


public SoftRender()
{
InitializeComponent();
InitSettings();

Init();
CenterToScreen();
}

private void InitSettings()
Expand All @@ -47,7 +48,225 @@ private void InitSettings()
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}

private void Init()
{
m_Bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height, PixelFormat.Format24bppRgb);
m_Device = new Device(m_Bmp);
m_Scene = new Scene();
m_ViewMat = m_Scene.Camera.GetLookAt();
m_ProjectionMat = m_Scene.Camera.GetProject((float)System.Math.PI * 0.3f, (float)ClientSize.Width / (float)ClientSize.Height, 1f, 100.0f);
m_Rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
m_PixelFormat = m_Bmp.PixelFormat;
AddCubeToScene(m_Scene);
}
private void AddCubeToScene(Scene scene)
{
if (scene == null)
return;

m_Cube = new Mesh("Cube");
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, -1, 1), new Vector4(-1, -1, -1, 1), new Vector2(0, 0), new Color3(0, 0, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, -1, 1), new Vector4(-1, -1, -1, 1), new Vector2(1, 0), new Color3(0, 0, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, -1, 1), new Vector4(-1, -1, -1, 1), new Vector2(0, 0), new Color3(0, 0, 0)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, -1, 1), new Vector4(1, -1, -1, 1), new Vector2(1, 0), new Color3(1, 0, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, -1, 1), new Vector4(1, -1, -1, 1), new Vector2(0, 0), new Color3(1, 0, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, -1, 1), new Vector4(1, -1, -1, 1), new Vector2(1, 0), new Color3(1, 0, 0)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, -1, 1), new Vector4(1, 1, -1, 1), new Vector2(1, 0), new Color3(1, 1, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, -1, 1), new Vector4(1, 1, -1, 1), new Vector2(1, 1), new Color3(1, 1, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, -1, 1), new Vector4(1, 1, -1, 1), new Vector2(1, 1), new Color3(1, 1, 0)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, -1, 1), new Vector4(-1, 1, -1, 1), new Vector2(0, 0), new Color3(0, 1, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, -1, 1), new Vector4(-1, 1, -1, 1), new Vector2(1, 1), new Color3(0, 1, 0)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, -1, 1), new Vector4(-1, 1, -1, 1), new Vector2(0, 1), new Color3(0, 1, 0)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, 1, 1), new Vector4(-1, -1, 1, 1), new Vector2(0, 1), new Color3(0, 0, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, 1, 1), new Vector4(-1, -1, 1, 1), new Vector2(0, 0), new Color3(0, 0, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, -1, 1, 1), new Vector4(-1, -1, 1, 1), new Vector2(0, 0), new Color3(0, 0, 1)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, 1, 1), new Vector4(1, -1, 1, 1), new Vector2(1, 1), new Color3(1, 0, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, 1, 1), new Vector4(1, -1, 1, 1), new Vector2(1, 0), new Color3(1, 0, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, -1, 1, 1), new Vector4(1, -1, 1, 1), new Vector2(1, 0), new Color3(1, 0, 1)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, 1, 1), new Vector4(1, 1, 1, 1), new Vector2(1, 1), new Color3(1, 1, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, 1, 1), new Vector4(1, 1, 1, 1), new Vector2(1, 1), new Color3(1, 1, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(1, 1, 1, 1), new Vector4(1, 1, 1, 1), new Vector2(1, 1), new Color3(1, 1, 1)));

m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, 1, 1), new Vector4(-1, 1, 1, 1), new Vector2(0, 1), new Color3(0, 1, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, 1, 1), new Vector4(-1, 1, 1, 1), new Vector2(0, 1), new Color3(0, 1, 1)));
m_Cube.VertexBuffer.Add(new Vertex(new Vector4(-1, 1, 1, 1), new Vector4(-1, 1, 1, 1), new Vector2(0, 1), new Color3(0, 1, 1)));

m_Cube.Face = new Face[] {
// 正面
new Face(2, 5, 8, FaceType.NEAR),
new Face(2, 8, 11, FaceType.NEAR),
// 右面
new Face(4, 16, 7, FaceType.RIGHT),
new Face(16, 19, 7, FaceType.RIGHT),
// 左面
new Face(13, 1, 10, FaceType.LEFT),
new Face(13, 10, 22, FaceType.LEFT),
// 背面
new Face(17, 14, 23, FaceType.FAR),
new Face(17, 23, 20, FaceType.FAR),
// 上面
new Face(9, 6, 18, FaceType.TOP),
new Face(9, 18, 21, FaceType.TOP),
// 下面
new Face(12, 15, 3, FaceType.BUTTOM),
new Face(12, 3, 0, FaceType.BUTTOM)
};
RenderTexture[] textures = new RenderTexture[6];
for (int i = 0; i < 6; i++)
textures[i] = new RenderTexture(@"env" + i.ToString() + ".bmp");
m_Cube.RenderTexture = textures;

scene.AddMesh(m_Cube);
}


/// <summary>
/// 绘制事件
/// </summary>
/// <param name="pe"></param>
protected override void OnPaint(PaintEventArgs pe)
{
m_Data = this.m_Bmp.LockBits(m_Rect, ImageLockMode.ReadWrite, this.m_PixelFormat);
this.m_Device.Clear(m_Data);
m_Device.Render(m_Scene, m_Data, m_ViewMat, m_ProjectionMat);
this.m_Bmp.UnlockBits(m_Data);
m_Graphics = pe.Graphics;
m_Graphics.DrawImage(this.m_Bmp, new Rectangle(0, 0, m_Bmp.Width, m_Bmp.Height));
}

/// <summary>
/// 初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="g"></param>
private void OnLoad(object sender, EventArgs g)
{
this.MouseWheel += new MouseEventHandler(OnMouseWheel);
this.MouseMove += new MouseEventHandler(OnMouseMove);
this.MouseDown += new MouseEventHandler(OnMouseDown);
this.MouseUp += new MouseEventHandler(OnMouseUp);
}

/// <summary>
/// 键盘事件
/// </summary>
/// <param name="msg"></param>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.NumPad0:
case Keys.Q:
m_Device.RenderMode = RenderMode.WIREFRAME;
break;
case Keys.NumPad1:
case Keys.W:
m_Device.RenderMode = RenderMode.VERTEXCOLOR;
break;
case Keys.NumPad2:
case Keys.E:
m_Device.RenderMode = RenderMode.TEXTURED;
break;
case Keys.NumPad3:
case Keys.R:
m_Device.RenderMode = RenderMode.CUBETEXTURED;
break;
case Keys.F1:
Light light = new Light(new Vector4(5, 5, -5, 1), new Color3(0.8f, 1.0f, 1.0f));
m_Scene.AddLight(light);
m_Scene.UseLight = true;
break;
case Keys.F2:
m_Scene.DeleLight();
m_Scene.UseLight = false;
break;
case Keys.Escape:
Close();
break;
}

if (keyData != Keys.Escape)
this.Invalidate();

return true;
}

/// <summary>
/// 鼠标滚动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta == 0)
return;

m_Scene.Camera.MoveForward(e.Delta / (float)900);
m_ViewMat = m_Scene.Camera.GetLookAt();
this.Invalidate();
}

/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (m_IsMouseLeftDown == false)
return;

if (e.Button == MouseButtons.Left)
{
float x = e.X;
float y = e.Y;
float dx = m_MouseLeftPos.x - x;
float dy = m_MouseLeftPos.x - y;
m_Cube.Transform = m_Cube.Transform * Matrix4x4.RotateY(dx / 5f);
m_Cube.Transform = m_Cube.Transform * Matrix4x4.RotateX(dy / 5f);
m_MouseLeftPos.x = x;
m_MouseLeftPos.x = y;
this.Invalidate();
}
}

/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
m_IsMouseLeftDown = true;
m_MouseLeftPos.x = e.X;
m_MouseLeftPos.y = e.Y;
}
}

/// <summary>
/// 鼠标抬起
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
m_IsMouseLeftDown = false;
m_MouseLeftPos.x = 0f;
m_MouseLeftPos.y = 0f;
}
}

}
}
9 changes: 4 additions & 5 deletions SoftRender/Render/Camera.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ public Matrix4x4 GetLookAt()

zAxis = m_target - m_Position;
zAxis.Normalize();
yAxis = Vector4.Cross(m_Up, m_Position);
yAxis.Normalize();
xAxis = Vector4.Cross(zAxis, yAxis);
xAxis = Vector4.Cross(m_Up, m_Position);
xAxis.Normalize();
yAxis = Vector4.Cross(zAxis, xAxis);
yAxis.Normalize();

view[0, 0] = xAxis.x;
view[1, 0] = xAxis.y;
Expand Down Expand Up @@ -89,7 +89,6 @@ public Matrix4x4 GetLookAt()
public Matrix4x4 GetProject(float fov,float aspect,float zn,float zf)
{
Matrix4x4 project = new Matrix4x4();

project.SetZero();
project[0, 0] = 1 / ((float)Math.Tan(fov * 0.5f) * aspect);
project[1, 1] = 1 / ((float)Math.Tan(fov * 0.5f));
Expand All @@ -107,7 +106,7 @@ public void Rotate(Vector4 position ,float x,float y)

public void MoveForward(float distance)
{
Vector4 dir = (Target - Position);
Vector4 dir = (m_target - m_Position);
float w = m_Position.w;
if (distance > 0 && dir.length < 1.5f)
{
Expand Down
2 changes: 1 addition & 1 deletion SoftRender/Render/Clip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Vertex Intersect(Vertex v1, Vertex v2, FaceType face, Vector4 vMin, Vector4 vMax

Vector4 clipPos = new Vector4();
Vector4 pos = new Vector4();
Color col = new Color(0, 0, 0);
Color3 col = new Color3(0, 0, 0);
Vector4 normal = new Vector4();
Vector2 uv = new Vector2();

Expand Down
Loading

0 comments on commit 354c0fa

Please sign in to comment.