Cleaned up the engine and added support for CSV file parsing.

This commit is contained in:
2020-12-04 00:15:18 -06:00
parent e39eb39d2c
commit 51c5ac335a
2 changed files with 97 additions and 13 deletions
+26 -4
View File
@@ -36,14 +36,36 @@ class Mesh:
if line[0] == 'f': if line[0] == 'f':
tmp = line.split(' ') tmp = line.split(' ')
x = tmp[1].split('//')[0]
y = tmp[2].split('//')[0]
z = tmp[3].split('//')[0]
# Subtract one because the obj file isn't zero indexed. # Subtract one because the obj file isn't zero indexed.
row1 = self.vertices[int(tmp[1]) - 1] row1 = self.vertices[int(x) - 1]
row2 = self.vertices[int(tmp[2]) - 1] row2 = self.vertices[int(y) - 1]
row3 = self.vertices[int(tmp[3]) - 1] row3 = self.vertices[int(z) - 1]
self.triangles.append(Triangle(Matrix3x3(row1, row2, row3))) self.triangles.append(Triangle(Matrix3x3(row1, row2, row3)))
def load_csv(self, path):
values = []
x = 0
y = -2
with open(path, 'r') as reader:
values = reader.readlines()
for i in range(0, 60, 3):
tmp = values[i].split(',')
row1 = Vector3d(x, y, float(tmp[6]))
tmp = values[i + 1].split(',')
row2 = Vector3d(x + 0.5, y, float(tmp[6]))
tmp = values[i + 2].split(',')
row3 = Vector3d(x, y + 0.5, float(tmp[6]))
self.triangles.append(Triangle(Matrix3x3(row1, row2, row3)))
self.triangles.append(Triangle(Matrix3x3(row2, row3, Vector3d(x + 0.5, y + 0.5, float(tmp[6])))))#, row2, row3)))
x += 0.5
#y -= 0.5
def __getitem__(self, key): def __getitem__(self, key):
return self.triangles[key] return self.triangles[key]
+71 -9
View File
@@ -1,6 +1,7 @@
import window import window
import math import math
import copy import copy
from tkinter.font import Font
from matrix import Matrix4x4, Matrix3x3 from matrix import Matrix4x4, Matrix3x3
from vectors import Vector4d, Vector3d, Vector2d from vectors import Vector4d, Vector3d, Vector2d
from engine import Mesh from engine import Mesh
@@ -10,7 +11,7 @@ ui = window.Window(600, 600)
near_plane = 0.1 near_plane = 0.1
far_plane = 1000.0 far_plane = 1000.0
fov = 90.0 fov = 90.0
#''' '''
tris =[ tris =[
Matrix3x3(Vector3d(0.0,0.0,0.0),Vector3d(0.0,1.0,0.0),Vector3d(1.0,1.0,0.0)), Matrix3x3(Vector3d(0.0,0.0,0.0),Vector3d(0.0,1.0,0.0),Vector3d(1.0,1.0,0.0)),
Matrix3x3(Vector3d(0.0,0.0,0.0),Vector3d(1.0,1.0,0.0),Vector3d(1.0,0.0,0.0)), Matrix3x3(Vector3d(0.0,0.0,0.0),Vector3d(1.0,1.0,0.0),Vector3d(1.0,0.0,0.0)),
@@ -25,13 +26,17 @@ Matrix3x3(Vector3d(0.0,1.0,0.0),Vector3d(1.0,1.0,1.0),Vector3d(1.0,1.0,0.0)),
Matrix3x3(Vector3d(1.0,0.0,1.0),Vector3d(0.0,0.0,1.0),Vector3d(0.0,0.0,0.0)), Matrix3x3(Vector3d(1.0,0.0,1.0),Vector3d(0.0,0.0,1.0),Vector3d(0.0,0.0,0.0)),
Matrix3x3(Vector3d(1.0,0.0,1.0),Vector3d(0.0,0.0,0.0),Vector3d(1.0,0.0,0.0)) Matrix3x3(Vector3d(1.0,0.0,1.0),Vector3d(0.0,0.0,0.0),Vector3d(1.0,0.0,0.0))
] ]
#''' tris = [
#tris = Mesh() Matrix3x3(Vector3d(0,0,0),Vector3d(0,2000,0.0),Vector3d(1,1,0))
]'''
tris = Mesh()
def main(): def main():
#tris.load_obj_file('shuttle.obj') tris.load_obj_file('reduced.obj')
#tris.load_csv('values.csv')
ui.scale = 3 ui.scale = 3
ui.thetax = 1 ui.thetax = 1
ui.thetaz = 1 ui.thetaz = 1
ui.canvas.configure(scrollregion = ui.canvas.bbox("all"))
ui.window.bind('<Left>', left) ui.window.bind('<Left>', left)
ui.window.bind('<Right>', right) ui.window.bind('<Right>', right)
ui.window.bind('<Up>', up) ui.window.bind('<Up>', up)
@@ -40,7 +45,10 @@ def main():
ui.window.bind('<Button-5>', wheel) ui.window.bind('<Button-5>', wheel)
#ui.window.bind('<ButtonPress-1>', mouse_start) #ui.window.bind('<ButtonPress-1>', mouse_start)
ui.canvas.bind('<B1-Motion>', mouse_end) ui.canvas.bind('<B1-Motion>', mouse_end)
ui.canvas.bind('<Motion>', mouse_motion)
ui.canvas.old_coords = None ui.canvas.old_coords = None
ui.canvas.just_the_tip = ui.canvas.create_rectangle(0, 0, 0, 0, fill='blue')
ui.canvas.just_the_label = ui.canvas.create_text(0, 0)
ui.window.after(0, draw_scene) ui.window.after(0, draw_scene)
ui.show() ui.show()
@@ -62,12 +70,15 @@ def left(event):
draw_scene() draw_scene()
def right(event): def right(event):
ui.thetaz -= .1 #ui.thetaz -= .1
draw_scene() #draw_scene()
ui.canvas.yview_moveto(.1)
ui.canvas.update()
def up(event): def up(event):
ui.thetax += .1 ui.thetax += .1
draw_scene() draw_scene()
ui.canvas.create_text(100, 100, text="Up pressed")
def down(event): def down(event):
ui.thetax -= .1 ui.thetax -= .1
@@ -90,6 +101,35 @@ def mouse_end(event):
draw_scene() draw_scene()
def mouse_motion(event):
x, y = event.x, event.y
draw_x = x
draw_y = y
id = ui.canvas.find_closest(x, y)
n = ui.canvas.coords(id)
if len(n) != 6: return
text = "1250 = 100((1 -1.08 ^ -240) / 0.08) | 95%"#"Nearest Triangle: (%d, %d) (%d, %d) (%d, %d)" %(n[0], n[1], n[2], n[3], n[4], n[5])#"Now the tool tip auto sizes to fit text"
width = Font(size=12, family="Hack").measure(text)
if width + x > ui.width:
draw_x = x - width - 30
if draw_x < 0:
draw_x = 0
y += 20
ui.canvas.delete(ui.canvas.just_the_tip)
ui.canvas.delete(ui.canvas.just_the_label)
ui.canvas.just_the_tip = ui.canvas.create_rectangle(draw_x + 14, y, draw_x + width + 16, y + 20, fill='grey')
ui.canvas.just_the_label = ui.canvas.create_text(draw_x + width / 2 + 15, y + 9, font="Hack 12", text=text)
ui.canvas.update()
#width = tk.font.Font(size=12, family="Times New Roman").measure("Some Tool Tip Nonsense")
#heigth = ui.canvas.find_withtag(ui.canvas.just_the_label) #.winfo_height()
#print(width)
#ui.canvas.delete(ui.canvas.just_the_label)
#ui.canvas.just_the_label = ui.canvas.create_text(x + width, y + y/2, text="Some tool tip nonsense")
#ui.canvas.update()
def draw_scene(): def draw_scene():
ui.canvas.delete("all") ui.canvas.delete("all")
aspect_ratio = ui.height / ui.width aspect_ratio = ui.height / ui.width
@@ -97,14 +137,19 @@ def draw_scene():
projection_matrix = Matrix4x4.get_projection_matrix(fov, aspect_ratio, near_plane, far_plane) projection_matrix = Matrix4x4.get_projection_matrix(fov, aspect_ratio, near_plane, far_plane)
rotation_matrix_z = Matrix4x4.get_y_rotation_matrix(ui.thetaz * .5) rotation_matrix_z = Matrix4x4.get_y_rotation_matrix(ui.thetaz * .5)
#print("Z:\n%s" %(rotation_matrix_z))
rotation_matrix_x = Matrix4x4.get_x_rotation_matrix(ui.thetax) rotation_matrix_x = Matrix4x4.get_x_rotation_matrix(ui.thetax)
#print("X:\n%s" %(rotation_matrix_x))
translation = Matrix4x4.get_translation_matrix(Vector3d(0, 0, ui.scale)) translation = Matrix4x4.get_translation_matrix(Vector3d(0, 0, ui.scale))
#print("T:\n%s" %(translation))
world_matrix = Matrix4x4.get_identity_matrix() world_matrix = Matrix4x4.get_identity_matrix()
#print("W:\n%s" %(world_matrix))
world_matrix = rotation_matrix_z.multiply_matrix(rotation_matrix_x) world_matrix = rotation_matrix_z.multiply_matrix(rotation_matrix_x)
#print("W * Z:\n%s" %(world_matrix))
world_matrix = world_matrix.multiply_matrix(translation) world_matrix = world_matrix.multiply_matrix(translation)
#print("W * T:\n%s" %(world_matrix))
triangles = [] triangles = []
@@ -132,6 +177,7 @@ def draw_scene():
dot_product = normal.dot_product(light) dot_product = normal.dot_product(light)
r = abs(int(255 * dot_product)) r = abs(int(255 * dot_product))
color = compute(r)
# Scale into view # Scale into view
row1 = projection_matrix.multiply_3d(transformed.row1) row1 = projection_matrix.multiply_3d(transformed.row1)
@@ -158,7 +204,7 @@ def draw_scene():
projected.row3.y *= .5 * ui.height projected.row3.y *= .5 * ui.height
t = Triangle(projected) t = Triangle(projected)
t.color = r t.color = color
t.average = (t.coords.row1.z + t.coords.row2.z + t.coords.row3.z) / 3 t.average = (t.coords.row1.z + t.coords.row2.z + t.coords.row3.z) / 3
triangles.append(t) triangles.append(t)
@@ -167,8 +213,14 @@ def draw_scene():
for projected in triangles: for projected in triangles:
r = projected.color r = projected.color
'''
print("1: x:%f.2 y:%f.2" %(projected.coords.row1.x, projected.coords.row1.y))
print("2: x:%f.2 y:%f.2" %(projected.coords.row2.x, projected.coords.row2.y))
print("3: x:%f.2 y:%f.2" %(projected.coords.row3.x, projected.coords.row3.y))
print()
'''
coords = [projected.coords.row1.x, projected.coords.row1.y, projected.coords.row2.x, projected.coords.row2.y, projected.coords.row3.x, projected.coords.row3.y] coords = [projected.coords.row1.x, projected.coords.row1.y, projected.coords.row2.x, projected.coords.row2.y, projected.coords.row3.x, projected.coords.row3.y]
ui.canvas.create_polygon(coords, fill=from_rgb(r, r, r), outline="black") ui.canvas.create_polygon(coords, fill=from_rgb(r[0], r[1], r[2]), outline=from_rgb(0, 255, 0))
ui.canvas.update() ui.canvas.update()
@@ -177,4 +229,14 @@ def draw_scene():
def from_rgb(r, b, g): def from_rgb(r, b, g):
return "#%02x%02x%02x" %(r, g, b) return "#%02x%02x%02x" %(r, g, b)
def compute(r):
r = r * 0.38
b = r
g = r * 1.6
if g > 255:
g = 255
return (int(r), int(g), int(b))
main() main()