Common Lisp library for manipulating Doom and Quake WAD files and PAK files.
Revisão | 4cd7d6d646e7719b6da01fa5123ceee4ea9b8110 (tree) |
---|---|
Hora | 2019-12-29 09:36:23 |
Autor | Alexa Jones-Gonzales <alexa@part...> |
Commiter | Alexa Jones-Gonzales |
Add classes for BSP2 and 2PSB files
@@ -332,6 +332,12 @@ | ||
332 | 332 | :ledges (make-instance 'bsp-entry) |
333 | 333 | :models (make-instance 'bsp-entry))))) |
334 | 334 | |
335 | +(defclass bsp2-file (bsp-file) | |
336 | + ()) | |
337 | + | |
338 | +(defclass 2psb-file (bsp-file) | |
339 | + ()) | |
340 | + | |
335 | 341 | (defmethod print-object ((obj bsp-file) out) |
336 | 342 | (print-unreadable-object (obj out :type t) |
337 | 343 | (format out "Version: 29"))) |
@@ -15,6 +15,8 @@ | ||
15 | 15 | ;;;; along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | (in-package :p36.waddle) |
17 | 17 | |
18 | +;;(declaim (optimize (debug 3))) | |
19 | + | |
18 | 20 | (defgeneric bsp-file-entry (bsp entry)) |
19 | 21 | (defgeneric bsp-load-header (bsp source)) |
20 | 22 | (defgeneric load-bsp (source)) |
@@ -55,8 +57,19 @@ | ||
55 | 57 | (getf (slot-value bsp 'entries) entry)) |
56 | 58 | |
57 | 59 | (defmethod load-bsp ((source stream)) |
58 | - (let ((bsp (make-instance 'bsp-file))) | |
59 | - (bsp-load-header bsp source) | |
60 | + (let* ((bsp (make-instance 'bsp-file)) | |
61 | + (ver (bsp-load-header bsp source))) | |
62 | + | |
63 | + ;; Change to a BSP2 or 2PSB as-needed, it'll affect the loading. | |
64 | + (let ((orig-ents (slot-value bsp 'entries))) | |
65 | + (cond | |
66 | + ((= ver +bsp2-version+) | |
67 | + (setf bsp (make-instance 'bsp2-file)) | |
68 | + (setf (slot-value bsp 'entries) orig-ents)) | |
69 | + | |
70 | + ((= ver +2psb-version+) | |
71 | + (setf bsp (make-instance '2psb-file)) | |
72 | + (setf (slot-value bsp 'entries) orig-ents)))) | |
60 | 73 | |
61 | 74 | (bsp-load-entities bsp source) |
62 | 75 | (bsp-load-planes bsp source) |
@@ -91,14 +104,13 @@ | ||
91 | 104 | (unless (or (= ver +bsp-version+) |
92 | 105 | (= ver +bsp2-version+) |
93 | 106 | (= ver +2psb-version+)) |
94 | - (error 'bsp-error :text (format nil "Bad BSP version: ~a" ver)))) | |
107 | + (error 'bsp-error :text (format nil "Bad BSP version: ~a" ver))) | |
95 | 108 | |
96 | - (loop for (type entry) on (slot-value bsp 'entries) by #'cddr do | |
97 | - (progn | |
109 | + (loop for (type entry) on (slot-value bsp 'entries) by #'cddr do | |
98 | 110 | (setf (bsp-entry-offset entry) (p36:read-bytes-into-int source 4)) |
99 | - (setf (bsp-entry-size entry) (p36:read-bytes-into-int source 4)))) | |
111 | + (setf (bsp-entry-size entry) (p36:read-bytes-into-int source 4))) | |
100 | 112 | |
101 | - bsp) | |
113 | + ver)) | |
102 | 114 | |
103 | 115 | (defmethod bsp-load-entities ((bsp bsp-file) (source stream)) |
104 | 116 | (let ((entry (bsp-file-entry bsp :entities))) |
@@ -164,9 +176,7 @@ | ||
164 | 176 | (setf (bsp-node-plane-id node) (p36:read-bytes-into-int source 4)) |
165 | 177 | (setf (bsp-node-front node) (p36:read-bytes-into-uint source 2)) |
166 | 178 | (setf (bsp-node-back node) (p36:read-bytes-into-uint source 2)) |
167 | - | |
168 | 179 | (setf (bsp-node-bounding-box node) (read-new-short-bounding-box source)) |
169 | - | |
170 | 180 | (setf (bsp-node-face-id node) (p36:read-bytes-into-uint source 2)) |
171 | 181 | (setf (bsp-node-num-faces node) (p36:read-bytes-into-uint source 2)))) |
172 | 182 |