Shader class, some cleaning
This commit is contained in:
parent
cfe9f7e913
commit
392551f2c7
|
@ -3,8 +3,8 @@
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from d3.conv.ply import PLYExporter
|
from d3.model.ply import PLYExporter
|
||||||
from d3.conv.loadmodel import convert
|
from d3.model.tools import convert
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
def check_path(path, should_exist):
|
def check_path(path, should_exist):
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from .conv.model import Vertex
|
from .geometry import Vector
|
||||||
|
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
from OpenGL.GLU import *
|
from OpenGL.GLU import *
|
||||||
|
@ -8,9 +8,9 @@ from OpenGL.GLU import *
|
||||||
|
|
||||||
class Camera:
|
class Camera:
|
||||||
def __init__(self, position = None, target = None, up = None):
|
def __init__(self, position = None, target = None, up = None):
|
||||||
self.position = Vertex() if position is None else position
|
self.position = Vector() if position is None else position
|
||||||
self.target = Vertex() if target is None else target
|
self.target = Vector() if target is None else target
|
||||||
self.up = Vertex(0.0,1.0,0.0) if up is None else target
|
self.up = Vector(0.0,1.0,0.0) if up is None else target
|
||||||
|
|
||||||
def look(self):
|
def look(self):
|
||||||
gluLookAt(
|
gluLookAt(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from .conv.model import Vertex
|
from .geometry import Vector
|
||||||
|
|
||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ class Controls:
|
||||||
class TrackBallControls(Controls):
|
class TrackBallControls(Controls):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.vertex = Vertex()
|
self.vertex = Vector()
|
||||||
self.theta = 0
|
self.theta = 0
|
||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
|
@ -36,7 +36,7 @@ class TrackBallControls(Controls):
|
||||||
coeff = 0.001
|
coeff = 0.001
|
||||||
move = pygame.mouse.get_rel()
|
move = pygame.mouse.get_rel()
|
||||||
|
|
||||||
dV = Vertex(move[1] * time * coeff, move[0] * time * coeff, 0)
|
dV = Vector(move[1] * time * coeff, move[0] * time * coeff, 0)
|
||||||
dTheta = dV.norm2()
|
dTheta = dV.norm2()
|
||||||
|
|
||||||
if abs(dTheta) < 0.00001:
|
if abs(dTheta) < 0.00001:
|
||||||
|
@ -49,9 +49,9 @@ class TrackBallControls(Controls):
|
||||||
cosDT2 = math.cos(dTheta / 2)
|
cosDT2 = math.cos(dTheta / 2)
|
||||||
sinDT2 = math.sin(dTheta / 2)
|
sinDT2 = math.sin(dTheta / 2)
|
||||||
|
|
||||||
A = cosT2 * sinDT2 * dV + cosDT2 * sinT2 * self.vertex + sinDT2 * sinT2 * Vertex.cross_product(dV, self.vertex)
|
A = cosT2 * sinDT2 * dV + cosDT2 * sinT2 * self.vertex + sinDT2 * sinT2 * Vector.cross_product(dV, self.vertex)
|
||||||
|
|
||||||
self.theta = 2 * math.acos(cosT2 * cosDT2 - sinT2 * sinDT2 * Vertex.dot(dV, self.vertex))
|
self.theta = 2 * math.acos(cosT2 * cosDT2 - sinT2 * sinDT2 * Vector.dot(dV, self.vertex))
|
||||||
|
|
||||||
self.vertex = A
|
self.vertex = A
|
||||||
self.vertex.normalize()
|
self.vertex.normalize()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from .model import ModelParser, Exporter, Vertex, TexCoord, Normal, FaceVertex, Face
|
from .basemodel import ModelParser, Exporter, Vertex, TexCoord, Normal, FaceVertex, Face
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
def is_obj(filename):
|
def is_obj(filename):
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from .model import ModelParser, Exporter, Vertex, Face, FaceVertex
|
from .basemodel import ModelParser, Exporter, Vertex, Face, FaceVertex
|
||||||
|
|
||||||
def is_ply(filename):
|
def is_ply(filename):
|
||||||
return filename[-4:] == '.ply'
|
return filename[-4:] == '.ply'
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from .obj import is_obj, OBJParser, OBJExporter
|
from .obj import is_obj, OBJParser, OBJExporter
|
||||||
from .ply import is_ply, PLYParser, PLYExporter
|
from .ply import is_ply, PLYParser, PLYExporter
|
||||||
|
from .basemodel import ModelParser, Exporter
|
||||||
|
|
||||||
def load_model(path):
|
def load_model(path):
|
||||||
parser = None
|
parser = None
|
|
@ -0,0 +1,41 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
import OpenGL.GL as gl
|
||||||
|
import OpenGL.GL.shaders as sh
|
||||||
|
|
||||||
|
class DefaultShader:
|
||||||
|
|
||||||
|
def __init__(self, vertex_path = None, fragment_path = None):
|
||||||
|
|
||||||
|
if vertex_path is None:
|
||||||
|
vertex_path = dir_path + '/../assets/shaders/shader.vert'
|
||||||
|
if fragment_path is None:
|
||||||
|
fragment_path = dir_path + '/../assets/shaders/shader.frag'
|
||||||
|
|
||||||
|
|
||||||
|
with open(vertex_path) as f:
|
||||||
|
self.vertex_src = f.read()
|
||||||
|
|
||||||
|
with open(fragment_path) as f:
|
||||||
|
self.fragment_src = f.read()
|
||||||
|
|
||||||
|
self.compile_shaders()
|
||||||
|
self.compile_program()
|
||||||
|
|
||||||
|
|
||||||
|
def compile_shaders(self):
|
||||||
|
self.vertex_shader = sh.compileShader(self.vertex_src, gl.GL_VERTEX_SHADER)
|
||||||
|
self.fragment_shader = sh.compileShader(self.fragment_src, gl.GL_FRAGMENT_SHADER)
|
||||||
|
|
||||||
|
def compile_program(self):
|
||||||
|
self.program = sh.compileProgram(self.vertex_shader, self.fragment_shader)
|
||||||
|
|
||||||
|
def bind(self):
|
||||||
|
gl.glUseProgram(self.program)
|
||||||
|
|
||||||
|
def unbind(self):
|
||||||
|
gl.glUseProgram(0)
|
||||||
|
pass
|
26
viewer.py
26
viewer.py
|
@ -12,22 +12,18 @@ from OpenGL.GL import *
|
||||||
from OpenGL.GL.shaders import *
|
from OpenGL.GL.shaders import *
|
||||||
from OpenGL.GLU import *
|
from OpenGL.GLU import *
|
||||||
|
|
||||||
from d3.conv.loadmodel import load_model
|
from d3.model.tools import load_model
|
||||||
from d3.conv.model import Vertex
|
from d3.geometry import Vector
|
||||||
from d3.controls import TrackBallControls
|
from d3.controls import TrackBallControls
|
||||||
from d3.camera import Camera
|
from d3.camera import Camera
|
||||||
|
from d3.shader import DefaultShader
|
||||||
|
|
||||||
WINDOW_WIDTH = 1024
|
WINDOW_WIDTH = 1024
|
||||||
WINDOW_HEIGHT = 768
|
WINDOW_HEIGHT = 768
|
||||||
|
|
||||||
x = -0.5
|
|
||||||
y = 0.5
|
|
||||||
width = 1
|
|
||||||
height = 1
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
|
|
||||||
camera = Camera(Vertex(0,0,5), Vertex(0,0,0))
|
camera = Camera(Vector(0,0,5), Vector(0,0,0))
|
||||||
controls = TrackBallControls()
|
controls = TrackBallControls()
|
||||||
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
|
@ -50,15 +46,7 @@ def main(args):
|
||||||
model = load_model(args.input)
|
model = load_model(args.input)
|
||||||
model.generate_vbos()
|
model.generate_vbos()
|
||||||
|
|
||||||
|
shader = DefaultShader()
|
||||||
VERTEX_SHADER = None
|
|
||||||
FRAGMENT_SHADER = None
|
|
||||||
with open('assets/shaders/shader.vert') as f:
|
|
||||||
VERTEX_SHADER = compileShader(f.read(), GL_VERTEX_SHADER)
|
|
||||||
with open('assets/shaders/shader.frag') as f:
|
|
||||||
FRAGMENT_SHADER = compileShader(f.read(), GL_FRAGMENT_SHADER)
|
|
||||||
|
|
||||||
SHADER = compileProgram(VERTEX_SHADER, FRAGMENT_SHADER)
|
|
||||||
|
|
||||||
while running:
|
while running:
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
|
@ -85,9 +73,9 @@ def main(args):
|
||||||
|
|
||||||
glPushMatrix()
|
glPushMatrix()
|
||||||
controls.apply()
|
controls.apply()
|
||||||
glUseProgram(SHADER)
|
shader.bind()
|
||||||
model.gl_draw()
|
model.gl_draw()
|
||||||
glUseProgram(0)
|
shader.unbind()
|
||||||
glPopMatrix()
|
glPopMatrix()
|
||||||
|
|
||||||
glFlush()
|
glFlush()
|
||||||
|
|
Loading…
Reference in New Issue