Skip to content

Commit

Permalink
Create tangent vectors for assimp models
Browse files Browse the repository at this point in the history
  • Loading branch information
Shinmera committed Mar 21, 2019
1 parent 5124da1 commit 0b94f1f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
12 changes: 8 additions & 4 deletions formats/assimp.lisp
Expand Up @@ -7,16 +7,19 @@
(in-package #:org.shirakumo.fraf.trial) (in-package #:org.shirakumo.fraf.trial)


(defmethod classimp->mesh (source) (defmethod classimp->mesh (source)
(let* ((mesh (make-instance 'vertex-mesh :vertex-type 'basic-vertex (let* ((mesh (make-instance 'vertex-mesh :vertex-type 'basic+-vertex
:face-length (classimp:primitive-types source))) :face-length (classimp:primitive-types source)))
(verts (vertices mesh)) (verts (vertices mesh))
(faces (faces mesh))) (faces (faces mesh)))
(loop for location across (classimp:vertices source) (loop for location across (classimp:vertices source)
for normal across (classimp:normals source) for normal across (classimp:normals source)
for uv across (aref (classimp:texture-coords source) 0) for uv across (aref (classimp:texture-coords source) 0)
for vertex = (make-instance 'basic-vertex :location (vec-from-vector location) for tangent across (classimp:tangents source)
:normal (vec-from-vector normal) for vertex = (make-instance 'basic+-vertex
:uv (vec2 (aref uv 0) (aref uv 1))) :location (vec-from-vector location)
:normal (vec-from-vector normal)
:uv (vec2 (aref uv 0) (aref uv 1))
:tangent (vec-from-vector tangent))
do (vector-push-extend vertex verts)) do (vector-push-extend vertex verts))
(loop for face across (classimp:faces source) (loop for face across (classimp:faces source)
do (loop for index across face do (loop for index across face
Expand All @@ -28,6 +31,7 @@
(scene (classimp:import-into-lisp file :processing-flags '(:ai-process-triangulate (scene (classimp:import-into-lisp file :processing-flags '(:ai-process-triangulate
:ai-process-flip-u-vs :ai-process-flip-u-vs
:ai-process-fix-infacing-normals :ai-process-fix-infacing-normals
:ai-process-calc-tangent-space
;; FIXME: should scene-graph sometime ;; FIXME: should scene-graph sometime
:ai-process-pre-transform-vertices))) :ai-process-pre-transform-vertices)))
(meshes (map 'vector #'classimp->mesh (classimp:meshes scene)))) (meshes (map 'vector #'classimp->mesh (classimp:meshes scene))))
Expand Down
18 changes: 18 additions & 0 deletions geometry.lisp
Expand Up @@ -165,9 +165,27 @@
(defmethod fill-vertex-attribute ((vertex colored-vertex) (attribute (eql 'color)) data offset) (defmethod fill-vertex-attribute ((vertex colored-vertex) (attribute (eql 'color)) data offset)
(fill-vector-data (color vertex) 'vec4 data offset)) (fill-vector-data (color vertex) 'vec4 data offset))


(defclass tangent-vertex (vertex)
((tangent :initform (vec 0 0 0) :initarg :tangent :accessor tangent :type vec3)))

(defmethod vertex= and ((a tangent-vertex) (b tangent-vertex))
(v= (tangent a) (tangent b)))

(defmethod vertex-attribute-size ((vertex tangent-vertex) (attribute (eql 'tangent)))
3)

(defmethod vertex-attributes append ((vertex tangent-vertex))
'(tangent))

(defmethod fill-vertex-attribute ((vertex tangent-vertex) (attribute (eql 'tangent)) data offset)
(fill-vector-data (tangent vertex) 'vec3 data offset))

(defclass basic-vertex (normal-vertex textured-vertex) (defclass basic-vertex (normal-vertex textured-vertex)
()) ())


(defclass basic+-vertex (tangent-vertex normal-vertex textured-vertex)
())

;;;; Translation ;;;; Translation


(defmethod update-instance-for-different-class ((mesh vertex-mesh) (array vertex-array) &key (data-usage :static-draw) (attributes T)) (defmethod update-instance-for-different-class ((mesh vertex-mesh) (array vertex-array) &key (data-usage :static-draw) (attributes T))
Expand Down

0 comments on commit 0b94f1f

Please sign in to comment.