From 96da188a689126950dfd3cff7f2181ef90e7fbea Mon Sep 17 00:00:00 2001 From: John Connors Date: Sun, 10 Aug 2008 10:26:09 +0100 Subject: [PATCH] Compiles again --- file-md2.lisp | 94 +++++++++++++++++++++++++++++++++++----------------- lodematron-test.lisp | 25 +++++++------- 2 files changed, 77 insertions(+), 42 deletions(-) diff --git a/file-md2.lisp b/file-md2.lisp index ffce993..c0274f8 100644 --- a/file-md2.lisp +++ b/file-md2.lisp @@ -221,6 +221,7 @@ (translation :md2-vector) (name :u8 :array-size 16))) +;; parsing -- aka file reading (defun parse-md2-skin-names (offset n stream) (file-position stream offset) @@ -240,10 +241,11 @@ (defun parse-md2-triangles (offset n stream) (file-position stream offset) - (let ((result (iterate - (for i from 0 below n) - (collecting (read-value 'md2-triangle stream))))) - result)) + (let ((result (make-array n))) + (iterate + (for i from 0 below n) + (setf (aref result i) (read-value 'md2-triangle stream)) + result))) (defun parse-md2-frames (offset n size nverts stream) @@ -263,19 +265,21 @@ (setf (gethash name frames) (cons header vertices)))) frames)) -(defun process-vertices (scale translation vertices) +;; posing -- aka animation. + +(defun pose-vertices (target scale translation vertices) "Return an array of vertices using the given frames scale and translation" - (let ((result (make-vertex3d-array (length vertices)))) - (iterate - (for index from 0 below (length vertices)) - (for vertex in-vector vertices) - (setf (vertex3d-aref result index) - (vertex3d* - (+ (* (aref (position-of vertex) 0) (x-of scale)) (x-of translation)) - (+ (* (aref (position-of vertex) 1) (y-of scale)) (y-of translation)) - (+ (* (aref (position-of vertex) 1) (z-of scale)) (z-of translation)) - 1.0))) - result)) + (iterate + (for index from 0 below (length vertices)) + (for vertex in-vector vertices) + (setf (vertex3d-aref target index) + (vertex3d* + (+ (* (aref (position-of vertex) 0) (x-of scale)) (x-of translation)) + (+ (* (aref (position-of vertex) 1) (y-of scale)) (y-of translation)) + (+ (* (aref (position-of vertex) 1) (z-of scale)) (z-of translation)) + 1.0))) + (values)) + (defun processs-normals (vertices) (iterate @@ -287,18 +291,26 @@ (for uv in uvs) (collecting (vector2d* (/ (u-of uv) swidth) (/ (v-of uv) theight))))) -(defun process-faces (tris) - (iterate - (for tri in tris) - (collecting (cons - (list :vertices - (aref (vertex-indices-of tri) 0) - (aref (vertex-indices-of tri) 1) - (aref (vertex-indices-of tri) 2)) - (list :uvs - (aref (uv-indices-of tri) 0) - (aref (uv-indices-of tri) 1) - (aref (uv-indices-of tri) 2)))))) +(defun pose-faces (target tris) + (iterate + (for tri in-vector tris) + (for index from 0 below (length tris)) + (setf (triangle-aref target index) + (triangle* + (aref (vertex-indices-of tri) 0) + (aref (vertex-indices-of tri) 1) + (aref (vertex-indices-of tri) 2)))) + (values)) + +;; (collecting (cons +;; (list :vertices +;; (aref (vertex-indices-of tri) 0) +;; (aref (vertex-indices-of tri) 1) +;; (aref (vertex-indices-of tri) 2)) +;; (list :uvs +;; (aref (uv-indices-of tri) 0) +;; (aref (uv-indices-of tri) 1) +;; (aref (uv-indices-of tri) 2)))))) (defclass md2 () ((sts :accessor sts-of :initarg :sts) @@ -322,12 +334,34 @@ (defmethod pose ((model md2) (mesh simple-mesh) frame-name skin-name) + "Set the pose of mesh based on an md2 frame" (let ((frame (gethash frame-name (frames-of model)))) (when frame (let ((header (car frame)) (vertices (cdr frame))) - (setf (vertices-of mesh) (process-vertices (scale-of header) (translation-of header) vertices)))))) - + ;; problem when we texture -- 1:1 mapping betewen index and vertex is lost.. + ;; maybe md2 mesh with it's own texture - or reallocate and renumber vertices? + ;; just a new mesh type with extra attributes + + (setf (vertices-of mesh) (make-vertex3d-array (length vertices))) + (pose-vertices (vertices-of mesh) (scale-of header) (translation-of header) vertices) + (setf (faces-of mesh) (make-triangle-array (length (tris-of model)))) + (pose-faces (faces-of mesh) (tris-of model)))))) + +(defmethod repose ((model md2) (mesh simple-mesh) frame-name skin-name) + "Change the pose of an exising mesh already initialised with the md2" + (let ((frame (gethash frame-name (frames-of model)))) + (when frame + (let ((header (car frame)) + (vertices (cdr frame))) + ;; problem when we texture -- 1:1 mapping betewen index and vertex is lost.. + ;; maybe md2 mesh with it's own texture - or reallocate and renumber vertices? + ;; just a new mesh type with extra attributes + (pose-vertices (vertices-of mesh) (scale-of header) (translation-of header) vertices) + (pose-faces (faces-of mesh) (tris-of model)))))) + + + ;; (let (( ;; (mesh :clear-vertices) ;; (let ((pose-frame (get-frame-of mesh))) diff --git a/lodematron-test.lisp b/lodematron-test.lisp index 1030371..4609875 100644 --- a/lodematron-test.lisp +++ b/lodematron-test.lisp @@ -11,23 +11,23 @@ :direction :input :element-type '(unsigned-byte 8))) -(defparameter *header* (read-value 'md2-header *md2-file*)) +;; (defparameter *header* (read-value 'md2-header *md2-file*)) -(defparameter *uvs* (parse-md2-uvs (uv-offset-of *header*) (nuvs-of *header*) *md2-file*)) +;; (defparameter *uvs* (parse-md2-uvs (uv-offset-of *header*) (nuvs-of *header*) *md2-file*)) -(defparameter *tris* (parse-md2-triangles (tris-offset-of *header*) (ntris-of *header*) *md2-file*)) +;; (defparameter *tris* (parse-md2-triangles (tris-offset-of *header*) (ntris-of *header*) *md2-file*)) -(defparameter *frames* (parse-md2-frames (frames-offset-of *header*) - (nframes-of *header*) - (framesize-of *header*) - (nvertices-of *header*) *md2-file*)) +;; (defparameter *frames* (parse-md2-frames (frames-offset-of *header*) +;; (nframes-of *header*) +;; (framesize-of *header*) +;; (nvertices-of *header*) *md2-file*)) -(format *debug-io* "~D Skins ~D Vertices ~D UVS ~D Tris" - (nskins-of *header*) - (nvertices-of *header*) - (nuvs-of *header*) - (ntris-of *header*)) +;; (format *debug-io* "~D Skins ~D Vertices ~D UVS ~D Tris" +;; (nskins-of *header*) +;; (nvertices-of *header*) +;; (nuvs-of *header*) +;; (ntris-of *header*)) (defparameter *test-mesh* (make-instance 'simple-mesh)) @@ -35,6 +35,7 @@ (pose *test-md2* *test-mesh* "dalek042" "someskin") +(repose *test-md2* *test-mesh* "dalek043" "someskin") (close *md2-file*) -- 2.11.4.GIT