Skip to content

Commit 0699439

Browse files
committed
One-way seeing and Better rendering
1 parent f187a72 commit 0699439

File tree

7 files changed

+126
-48
lines changed

7 files changed

+126
-48
lines changed

core/eclCameras.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import math
33
import pygame
44

5-
class FlyCamera():
5+
class FlyAbsoluteCamera():
66

77
def __init__(self):
88
self.transform = Transform([0,0,0],[0,0,0])
@@ -15,17 +15,22 @@ def onKey(self,key):
1515
s=self.scene.deltaTime*self.movement_speed
1616
if key[pygame.K_q]: self.transform.position.y -=s
1717
if key[pygame.K_e]: self.transform.position.y +=s
18+
if key[pygame.K_w]: self.transform.position.x +=s
19+
if key[pygame.K_s]: self.transform.position.x -=s
20+
if key[pygame.K_a]: self.transform.position.z +=s
21+
if key[pygame.K_d]: self.transform.position.z -=s
22+
"""
23+
x,z = s*math.sin(self.transform.rotation.x),s*math.cos(self.transform.rotation.z)
1824
19-
x,y = s*math.sin(self.transform.rotation.y),s*math.cos(self.transform.rotation.y)
25+
if key[pygame.K_w]: self.transform.position.x +=x;self.transform.position.z +=z
26+
if key[pygame.K_s]: self.transform.position.x -=x;self.transform.position.z -=z
27+
if key[pygame.K_a]: self.transform.position.x -=z;self.transform.position.z +=x
28+
if key[pygame.K_d]: self.transform.position.x +=z;self.transform.position.z -=x"""
2029

21-
if key[pygame.K_w]: self.transform.position.x +=x;self.transform.position.z +=y;
22-
if key[pygame.K_s]: self.transform.position.x -=x;self.transform.position.z -=y;
23-
if key[pygame.K_a]: self.transform.position.x -=y;self.transform.position.z +=x;
24-
if key[pygame.K_d]: self.transform.position.x +=y;self.transform.position.z -=x;
2530

2631
def onMouseMove(self,move):
27-
x,y = move
28-
x/=self.sensitive; y/=self.sensitive
29-
self.transform.rotation.x+=y;self.transform.rotation.y+=x
30-
if self.transform.rotation.x > math.pi:self.transform.rotation.x = math.pi
31-
if self.transform.rotation.x < -math.pi:self.transform.rotation.x = -math.pi
32+
x,z = move
33+
x/=self.sensitive; z/=self.sensitive
34+
self.transform.rotation.z-=z;self.transform.rotation.x+=x
35+
if self.transform.rotation.z > math.pi/2:self.transform.rotation.z = math.pi/2
36+
if self.transform.rotation.z < -math.pi/2:self.transform.rotation.z = -math.pi/2

core/eclDef.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import math
2+
13
class eclVector3():
2-
def __init__(self,x,y,z):
4+
def __init__(self,x=0,y=0,z=0):
35
self.x,self.y,self.z = x,y,z
46
def __setitem__(self, numb, data):
57
if numb == 0: self.x = data
@@ -9,10 +11,10 @@ def __getitem__(self, numb):
911
if numb == 0: return self.x
1012
elif numb == 1: return self.y
1113
elif numb == 2: return self.z
12-
def __add__(self, vect3):
13-
return eclVector3(self.x+vect3[0],self.y+vect3[1],self.z+vect3[2])
14-
def __sub__(self, vect3):
15-
return eclVector3(self.x-vect3[0],self.y-vect3[1],self.z-vect3[2])
14+
def __add__(self, vect3):return eclVector3(self.x+vect3[0],self.y+vect3[1],self.z+vect3[2])
15+
def __sub__(self, vect3):return eclVector3(self.x-vect3[0],self.y-vect3[1],self.z-vect3[2])
16+
def __len__(self):return 3
17+
1618

1719
class Transform():
1820
def __init__(self,position,rotation):
@@ -31,11 +33,23 @@ class elcTriangle():
3133
def __init__(self,ptA=eclVector3(0,0,0),ptB=eclVector3(0,0,0),ptC=eclVector3(0,0,0)):
3234
self.points = [ptA,ptB,ptC]
3335
def calculateNormal(self):
34-
return NotImplemented
36+
line1 = eclVector3();line2 = eclVector3()
37+
38+
line1.x = self.points[1].x - self.points[0].x
39+
line1.y = self.points[1].y - self.points[0].y
40+
line1.z = self.points[1].z - self.points[0].z
41+
42+
line2.x = self.points[2].x - self.points[0].x
43+
line2.y = self.points[2].y - self.points[0].y
44+
line2.z = self.points[2].z - self.points[0].z
45+
46+
return crossProduct(line1,line2)
47+
3548
def __setitem__(self, numb, data):
3649
self.points[numb] = data
3750
def __getitem__(self, numb):
3851
return self.points[numb]
52+
def __len__(self):return 3
3953

4054
class elcMesh():
4155
def __init__(self,triList,isDoubleSided=False):
@@ -45,6 +59,19 @@ def __setitem__(self, numb, data):
4559
self.tri[numb] = data
4660
def __getitem__(self, numb):
4761
return self.tri[numb]
62+
def __len__(self):return len(self.tri)
63+
64+
def crossProduct(first:eclVector3,second:eclVector3):
65+
returning = eclVector3(1,1,1)
66+
try:
67+
returning.x = first.y*second.z - first.z*second.y
68+
returning.y = first.z*second.x - first.x*second.z
69+
returning.z = first.x*second.y - first.y*second.x
70+
l = math.sqrt(returning.x**2+returning.y**2+returning.z**2)
71+
returning.x /= l;returning.y /= l;returning.z /= l
72+
except ZeroDivisionError:
73+
print("Err")
74+
return returning
4875

4976
def setMeshByPoints(points,triangles):
5077
end = []

core/eclRenderer.py

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from core.eclDef import eclVector3, Transform, elcTriangle
66
from core.eclDef import XbyXmatrix, multiplyMatrixVector3
7+
from core.eclDef import crossProduct
78

89
class OldEuclidianRenderer():
910

@@ -178,28 +179,68 @@ def onAwake(self):
178179
self.screen = self.scene.screen
179180
self.w, self.h = self.screen.get_size()
180181
self.cx, self.cy = self.w //2,self.h //2
181-
near = self.conf.get("near",0.1)
182-
far = self.conf.get("far",1000)
183-
fov = self.conf.get("fov",90)
184-
182+
self.near = self.conf.get("near",0.1)
183+
self.far = self.conf.get("far",1000)
184+
self.fov = self.conf.get("fov",90)
185+
self.far_length = math.tan(self.fov/2)*self.far
186+
187+
@staticmethod # nerd shit
188+
def rotate2d(pos,rad): x,y = pos; s,c = math.sin(rad),math.cos(rad); return x*c-y*s,y*c+x*s
185189

190+
def _projection(self,vect3:eclVector3):
191+
try:
192+
X = vect3.x/((vect3.z*self.far_length)/self.far)
193+
Y = vect3.y/((vect3.z*self.far_length)/self.far)
194+
Z = (vect3.z-self.near)/(self.far-self.near)
195+
return eclVector3(X,Y,Z) # -1_1 -1_1 0_1
196+
except ZeroDivisionError:
197+
return eclVector3(0,0,0)
198+
199+
def draw(self,triangle:elcTriangle):
200+
try:
201+
pygame.draw.polygon(self.screen, (100,10,255),
202+
[ (triangle[0].x, triangle[0].y),
203+
(triangle[1].x, triangle[1].y),
204+
(triangle[2].x, triangle[2].y),
205+
(triangle[0].x, triangle[0].y)
206+
], 3)
207+
except TypeError:
208+
pass
186209

187210
def onRender(self):
188211

189212
self.screen.fill((0,0,0))
213+
absPosSelf = self.scene.getAbsoluteTransform(self).position
214+
absRotSelf = self.scene.getAbsoluteTransform(self).rotation
190215

191216
objs = self.scene.getByTag(self.tagToRender)
192-
for x in objs:
193-
for tri_ in x.mesh.tri:
194-
195-
#
196-
# x,y,z --> X,Y and Z as depth for verts calculations
197-
# -1 <= X,Y <= 1
198-
# 0 < Z < 1
199-
# BC = tan(fov/2)*far
200-
# X = x/((z*BC)/far)
201-
# Y = y/((z*BC)/far)
202-
# Z = (z-near)/(far-near)
203-
204-
# have a isVisible if countained X,Y in drawned shapes
205-
217+
for obj in objs:
218+
absPosObj = self.scene.getAbsoluteTransform(obj).position
219+
absRotObj = self.scene.getAbsoluteTransform(obj).rotation
220+
for tri_ in obj.mesh.tri:
221+
222+
triProj = elcTriangle()
223+
for x in range(3):
224+
posTemp = tri_[x]+absPosObj+absPosSelf
225+
# rotate
226+
posTemp.x, posTemp.z = self.rotate2d((posTemp.x,posTemp.z),absRotObj.x+absRotSelf.x)
227+
posTemp.y, posTemp.x = self.rotate2d((posTemp.y,posTemp.x),absRotObj.y+absRotSelf.y)
228+
posTemp.z, posTemp.y = self.rotate2d((posTemp.z,posTemp.y),absRotObj.z+absRotSelf.z)
229+
#posTemp.z, posTemp.x = self.rotate2d((posTemp.z,posTemp.x),absRotObj.y+absRotSelf.y)
230+
triProj[x] = self._projection(posTemp)
231+
232+
shouldDraw = False
233+
normal = triProj.calculateNormal()
234+
if (normal.x * (triProj[0].x - absPosObj.x + absPosSelf.x) +
235+
normal.y * (triProj[0].y - absPosObj.y + absPosSelf.y) +
236+
normal.z * (triProj[0].z - absPosObj.z + absPosSelf.z) < 0):shouldDraw = True
237+
238+
def rescale(x,min_,max_):return (x/2+0.5)*(max_+min_)
239+
240+
if shouldDraw:
241+
print("Draw, pos ="+str(triProj[0].x)+", "+str(triProj[0].x))
242+
self.draw(elcTriangle(
243+
eclVector3(rescale(triProj[0].x,0,self.w),rescale(triProj[0].y,0,self.h),0),
244+
eclVector3(rescale(triProj[1].x,0,self.w),rescale(triProj[1].y,0,self.h),0),
245+
eclVector3(rescale(triProj[2].x,0,self.w),rescale(triProj[2].y,0,self.h),0)
246+
))

core/eclShapes.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from core.eclDef import elcMesh, Transform, setMeshByPoints
22
class Cube():
33

4-
def __init__(self,pos,parent = None):
5-
self.transform = Transform(pos,[0,0,0])
4+
def __init__(self,transform,parent = None):
5+
if isinstance(transform,Transform):self.transform = transform
6+
else: self.transform = Transform(transform,[0,0,0])
67
self.parent = parent
7-
"""self.mesh = elcMesh( [
8+
self.mesh = elcMesh( [
89
[ [0,0,0], [0,1,0], [1,1,0]],
910
[ [0,0,0], [1,1,0], [1,0,0]],
1011
[ [1,0,0], [1,1,0], [1,1,1]],
@@ -17,8 +18,9 @@ def __init__(self,pos,parent = None):
1718
[ [0,1,0], [1,1,1], [1,1,0]],
1819
[ [1,0,1], [0,0,1], [0,0,0]],
1920
[ [1,0,1], [0,0,0], [1,0,0]],
20-
])"""
21+
])
22+
"""
2123
self.mesh = elcMesh(setMeshByPoints(
22-
[(-1,-1,-1),(1,-1,-1),(1,1,-1),(-1,1,-1),(-1,-1,1),(1,-1,1),(1,1,1),(-1,1,1)],
24+
[(0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1),(1,0,1),(1,1,1),(0,1,1)],
2325
[(0,1,2,3),(4,5,6,7),(0,1,5,4),(2,3,7,6),(0,3,7,4),(1,2,6,5)]
24-
))
26+
))"""

core/main.py

Whitespace-only changes.

core/scene.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ def getByID(self,id_):
2424
if id_ in self._objs.keys():return self._objs[id_]
2525
return None
2626

27-
def getAbsolutePos(self,obj):
27+
def getAbsoluteTransform(self,obj):
2828
if obj.parent == None: return obj.transform
29-
Ppos = self.getAbsolutePos(obj.parent)
29+
Ppos = self.getAbsoluteTransform(obj.parent)
3030
return Ppos+obj.transform
3131

3232
def call(self,methodName,*arg,**kwargs):

main.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
from core.eclRenderer import MatrixEuclidianRenderer, OldEuclidianRenderer
1+
from core.eclRenderer import MatrixEuclidianRenderer, OldEuclidianRenderer, EuclidianRenderer
22
from core.scene import Scene
33

44
from core.eclShapes import Cube
5+
from core.eclDef import Transform
56

67
import asyncio
78
import pygame
89

9-
from core.eclCameras import FlyCamera
10+
from core.eclCameras import FlyAbsoluteCamera
1011

1112
screen = pygame.display.set_mode([800,800])
1213

@@ -16,13 +17,15 @@
1617
sc = Scene()
1718

1819

19-
cam = FlyCamera()
20+
cam = FlyAbsoluteCamera()
2021
sc.addObject(cam)
21-
renderer = MatrixEuclidianRenderer('EUCLID',cam)
22+
renderer = EuclidianRenderer('EUCLID',cam)
2223
sc.addObject(renderer)
2324

2425
sc.addObject(Cube((0,0,0)),["EUCLID"])
25-
sc.addObject(Cube((3,0,2)),["EUCLID"])
26+
sc.addObject(Cube((0,0,1)),["EUCLID"])
27+
sc.addObject(Cube((0,0,-1)),["EUCLID"])
28+
sc.addObject(Cube(Transform([0,2,0],[0,0,0])),["EUCLID"])
2629

2730
loop = asyncio.get_event_loop()
2831
loop.run_until_complete(sc.load(screen))

0 commit comments

Comments
 (0)