├── .gitignore ├── README.md ├── capture.png ├── makefile ├── src ├── gfx │ ├── convimg.yaml │ ├── gfx.h │ ├── global_palette.c │ ├── global_palette.h │ ├── rgbi.png │ ├── tileset.c │ ├── tileset.h │ └── tileset.png ├── grid.c ├── main.c ├── monkey.c ├── quad │ ├── canvas.asm │ ├── def3d.h │ ├── euler.asm │ ├── fxmath.asm │ ├── fxmath.h │ ├── lut.asm │ ├── matrix.asm │ ├── matrix.h │ ├── ports.asm │ ├── quad.asm │ ├── quad.h │ ├── render.asm │ ├── shader │ │ ├── flat.asm │ │ ├── shader.asm │ │ └── textured.asm │ └── ti84pceg.inc └── zelda.c └── tools └── OBJtoHeader.java /.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /obj -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Quad3D 2 | 3 | A WIP 3D engine for the TI84+CE utilyzing a forward quad renderer. 4 | 5 | Includes C usage example. 6 | 7 | ![](capture.png) 8 | -------------------------------------------------------------------------------- /capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zaalan3/quad3D/215d84280883b8211a740c7d42a138e666a6a4f0/capture.png -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | # ---------------------------- 2 | # Makefile Options 3 | # ---------------------------- 4 | 5 | NAME = DEMO 6 | ICON = icon.png 7 | DESCRIPTION = "Quad3D Demo Program." 8 | COMPRESSED = NO 9 | ARCHIVED = NO 10 | LTO = YES 11 | 12 | CFLAGS = -Wall -Wextra -Oz 13 | CXXFLAGS = -Wall -Wextra -Oz 14 | 15 | # ---------------------------- 16 | 17 | include $(shell cedev-config --makefile) 18 | -------------------------------------------------------------------------------- /src/gfx/convimg.yaml: -------------------------------------------------------------------------------- 1 | palettes: 2 | - name: global_palette 3 | fixed-entries: 4 | - image: rgbi.png 5 | images: automatic 6 | 7 | converts: 8 | - name: tileset 9 | palette: global_palette 10 | width-and-height: false 11 | compress: zx7 12 | images: 13 | - tileset.png 14 | 15 | outputs: 16 | - type: c 17 | palettes: 18 | - global_palette 19 | converts: 20 | - tileset 21 | -------------------------------------------------------------------------------- /src/gfx/gfx.h: -------------------------------------------------------------------------------- 1 | #ifndef gfx_include_file 2 | #define gfx_include_file 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | #include "global_palette.h" 9 | #define tileset_palette_offset 0 10 | #include "tileset.h" 11 | 12 | #ifdef __cplusplus 13 | } 14 | #endif 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /src/gfx/global_palette.c: -------------------------------------------------------------------------------- 1 | unsigned char global_palette[512] = 2 | { 3 | 0x00, 0x00, /* 0: rgb( 0, 0, 0) */ 4 | 0x00, 0x00, /* 1: rgb( 0, 0, 0) */ 5 | 0x00, 0x00, /* 2: rgb( 0, 0, 0) */ 6 | 0x00, 0x00, /* 3: rgb( 0, 0, 0) */ 7 | 0x03, 0x00, /* 4: rgb( 0, 0, 25) */ 8 | 0x05, 0x00, /* 5: rgb( 0, 0, 41) */ 9 | 0x07, 0x00, /* 6: rgb( 0, 0, 58) */ 10 | 0x0a, 0x00, /* 7: rgb( 0, 0, 82) */ 11 | 0x07, 0x00, /* 8: rgb( 0, 0, 58) */ 12 | 0x0b, 0x00, /* 9: rgb( 0, 0, 90) */ 13 | 0x0f, 0x00, /* 10: rgb( 0, 0, 123) */ 14 | 0x15, 0x00, /* 11: rgb( 0, 0, 173) */ 15 | 0x0b, 0x00, /* 12: rgb( 0, 0, 90) */ 16 | 0x11, 0x00, /* 13: rgb( 0, 0, 140) */ 17 | 0x17, 0x00, /* 14: rgb( 0, 0, 189) */ 18 | 0x1f, 0x00, /* 15: rgb( 0, 0, 255) */ 19 | 0x60, 0x00, /* 16: rgb( 0, 24, 0) */ 20 | 0xa0, 0x00, /* 17: rgb( 0, 40, 0) */ 21 | 0xe0, 0x00, /* 18: rgb( 0, 57, 0) */ 22 | 0x40, 0x01, /* 19: rgb( 0, 81, 0) */ 23 | 0x63, 0x00, /* 20: rgb( 0, 24, 25) */ 24 | 0xa5, 0x00, /* 21: rgb( 0, 40, 41) */ 25 | 0xe7, 0x00, /* 22: rgb( 0, 57, 58) */ 26 | 0x4a, 0x01, /* 23: rgb( 0, 81, 82) */ 27 | 0x67, 0x00, /* 24: rgb( 0, 24, 58) */ 28 | 0xab, 0x00, /* 25: rgb( 0, 40, 90) */ 29 | 0xef, 0x00, /* 26: rgb( 0, 57, 123) */ 30 | 0x55, 0x01, /* 27: rgb( 0, 81, 173) */ 31 | 0x6b, 0x00, /* 28: rgb( 0, 24, 90) */ 32 | 0xb1, 0x00, /* 29: rgb( 0, 40, 140) */ 33 | 0xf7, 0x00, /* 30: rgb( 0, 57, 189) */ 34 | 0x5f, 0x01, /* 31: rgb( 0, 81, 255) */ 35 | 0xe0, 0x00, /* 32: rgb( 0, 57, 0) */ 36 | 0x60, 0x01, /* 33: rgb( 0, 89, 0) */ 37 | 0xe0, 0x01, /* 34: rgb( 0, 121, 0) */ 38 | 0xa0, 0x02, /* 35: rgb( 0, 170, 0) */ 39 | 0xe3, 0x00, /* 36: rgb( 0, 57, 25) */ 40 | 0x65, 0x01, /* 37: rgb( 0, 89, 41) */ 41 | 0xe7, 0x01, /* 38: rgb( 0, 121, 58) */ 42 | 0xaa, 0x02, /* 39: rgb( 0, 170, 82) */ 43 | 0xe7, 0x00, /* 40: rgb( 0, 57, 58) */ 44 | 0x6b, 0x01, /* 41: rgb( 0, 89, 90) */ 45 | 0xef, 0x01, /* 42: rgb( 0, 121, 123) */ 46 | 0xb5, 0x02, /* 43: rgb( 0, 170, 173) */ 47 | 0xeb, 0x00, /* 44: rgb( 0, 57, 90) */ 48 | 0x71, 0x01, /* 45: rgb( 0, 89, 140) */ 49 | 0xf7, 0x01, /* 46: rgb( 0, 121, 189) */ 50 | 0xbf, 0x02, /* 47: rgb( 0, 170, 255) */ 51 | 0x60, 0x01, /* 48: rgb( 0, 89, 0) */ 52 | 0x20, 0x02, /* 49: rgb( 0, 138, 0) */ 53 | 0xe0, 0x02, /* 50: rgb( 0, 186, 0) */ 54 | 0xe0, 0x03, /* 51: rgb( 0, 251, 0) */ 55 | 0x63, 0x01, /* 52: rgb( 0, 89, 25) */ 56 | 0x25, 0x02, /* 53: rgb( 0, 138, 41) */ 57 | 0xe7, 0x02, /* 54: rgb( 0, 186, 58) */ 58 | 0xea, 0x03, /* 55: rgb( 0, 251, 82) */ 59 | 0x67, 0x01, /* 56: rgb( 0, 89, 58) */ 60 | 0x2b, 0x02, /* 57: rgb( 0, 138, 90) */ 61 | 0xef, 0x02, /* 58: rgb( 0, 186, 123) */ 62 | 0xf5, 0x03, /* 59: rgb( 0, 251, 173) */ 63 | 0x6b, 0x01, /* 60: rgb( 0, 89, 90) */ 64 | 0x31, 0x02, /* 61: rgb( 0, 138, 140) */ 65 | 0xf7, 0x02, /* 62: rgb( 0, 186, 189) */ 66 | 0xff, 0x03, /* 63: rgb( 0, 251, 255) */ 67 | 0x00, 0x0c, /* 64: rgb( 25, 0, 0) */ 68 | 0x00, 0x14, /* 65: rgb( 41, 0, 0) */ 69 | 0x00, 0x1c, /* 66: rgb( 58, 0, 0) */ 70 | 0x00, 0x28, /* 67: rgb( 82, 0, 0) */ 71 | 0x03, 0x0c, /* 68: rgb( 25, 0, 25) */ 72 | 0x05, 0x14, /* 69: rgb( 41, 0, 41) */ 73 | 0x07, 0x1c, /* 70: rgb( 58, 0, 58) */ 74 | 0x0a, 0x28, /* 71: rgb( 82, 0, 82) */ 75 | 0x07, 0x0c, /* 72: rgb( 25, 0, 58) */ 76 | 0x0b, 0x14, /* 73: rgb( 41, 0, 90) */ 77 | 0x0f, 0x1c, /* 74: rgb( 58, 0, 123) */ 78 | 0x15, 0x28, /* 75: rgb( 82, 0, 173) */ 79 | 0x0b, 0x0c, /* 76: rgb( 25, 0, 90) */ 80 | 0x11, 0x14, /* 77: rgb( 41, 0, 140) */ 81 | 0x17, 0x1c, /* 78: rgb( 58, 0, 189) */ 82 | 0x1f, 0x28, /* 79: rgb( 82, 0, 255) */ 83 | 0x60, 0x0c, /* 80: rgb( 25, 24, 0) */ 84 | 0xa0, 0x14, /* 81: rgb( 41, 40, 0) */ 85 | 0xe0, 0x1c, /* 82: rgb( 58, 57, 0) */ 86 | 0x40, 0x29, /* 83: rgb( 82, 81, 0) */ 87 | 0x63, 0x0c, /* 84: rgb( 25, 24, 25) */ 88 | 0xa5, 0x14, /* 85: rgb( 41, 40, 41) */ 89 | 0xe7, 0x1c, /* 86: rgb( 58, 57, 58) */ 90 | 0x4a, 0x29, /* 87: rgb( 82, 81, 82) */ 91 | 0x67, 0x0c, /* 88: rgb( 25, 24, 58) */ 92 | 0xab, 0x14, /* 89: rgb( 41, 40, 90) */ 93 | 0xef, 0x1c, /* 90: rgb( 58, 57, 123) */ 94 | 0x55, 0x29, /* 91: rgb( 82, 81, 173) */ 95 | 0x6b, 0x0c, /* 92: rgb( 25, 24, 90) */ 96 | 0xb1, 0x14, /* 93: rgb( 41, 40, 140) */ 97 | 0xf7, 0x1c, /* 94: rgb( 58, 57, 189) */ 98 | 0x5f, 0x29, /* 95: rgb( 82, 81, 255) */ 99 | 0xe0, 0x0c, /* 96: rgb( 25, 57, 0) */ 100 | 0x60, 0x15, /* 97: rgb( 41, 89, 0) */ 101 | 0xe0, 0x1d, /* 98: rgb( 58, 121, 0) */ 102 | 0xa0, 0x2a, /* 99: rgb( 82, 170, 0) */ 103 | 0xe3, 0x0c, /* 100: rgb( 25, 57, 25) */ 104 | 0x65, 0x15, /* 101: rgb( 41, 89, 41) */ 105 | 0xe7, 0x1d, /* 102: rgb( 58, 121, 58) */ 106 | 0xaa, 0x2a, /* 103: rgb( 82, 170, 82) */ 107 | 0xe7, 0x0c, /* 104: rgb( 25, 57, 58) */ 108 | 0x6b, 0x15, /* 105: rgb( 41, 89, 90) */ 109 | 0xef, 0x1d, /* 106: rgb( 58, 121, 123) */ 110 | 0xb5, 0x2a, /* 107: rgb( 82, 170, 173) */ 111 | 0xeb, 0x0c, /* 108: rgb( 25, 57, 90) */ 112 | 0x71, 0x15, /* 109: rgb( 41, 89, 140) */ 113 | 0xf7, 0x1d, /* 110: rgb( 58, 121, 189) */ 114 | 0xbf, 0x2a, /* 111: rgb( 82, 170, 255) */ 115 | 0x60, 0x0d, /* 112: rgb( 25, 89, 0) */ 116 | 0x20, 0x16, /* 113: rgb( 41, 138, 0) */ 117 | 0xe0, 0x1e, /* 114: rgb( 58, 186, 0) */ 118 | 0xe0, 0x2b, /* 115: rgb( 82, 251, 0) */ 119 | 0x63, 0x0d, /* 116: rgb( 25, 89, 25) */ 120 | 0x25, 0x16, /* 117: rgb( 41, 138, 41) */ 121 | 0xe7, 0x1e, /* 118: rgb( 58, 186, 58) */ 122 | 0xea, 0x2b, /* 119: rgb( 82, 251, 82) */ 123 | 0x67, 0x0d, /* 120: rgb( 25, 89, 58) */ 124 | 0x2b, 0x16, /* 121: rgb( 41, 138, 90) */ 125 | 0xef, 0x1e, /* 122: rgb( 58, 186, 123) */ 126 | 0xf5, 0x2b, /* 123: rgb( 82, 251, 173) */ 127 | 0x6b, 0x0d, /* 124: rgb( 25, 89, 90) */ 128 | 0x31, 0x16, /* 125: rgb( 41, 138, 140) */ 129 | 0xf7, 0x1e, /* 126: rgb( 58, 186, 189) */ 130 | 0xff, 0x2b, /* 127: rgb( 82, 251, 255) */ 131 | 0x00, 0x1c, /* 128: rgb( 58, 0, 0) */ 132 | 0x00, 0x2c, /* 129: rgb( 90, 0, 0) */ 133 | 0x00, 0x3c, /* 130: rgb(123, 0, 0) */ 134 | 0x00, 0x54, /* 131: rgb(173, 0, 0) */ 135 | 0x03, 0x1c, /* 132: rgb( 58, 0, 25) */ 136 | 0x05, 0x2c, /* 133: rgb( 90, 0, 41) */ 137 | 0x07, 0x3c, /* 134: rgb(123, 0, 58) */ 138 | 0x0a, 0x54, /* 135: rgb(173, 0, 82) */ 139 | 0x07, 0x1c, /* 136: rgb( 58, 0, 58) */ 140 | 0x0b, 0x2c, /* 137: rgb( 90, 0, 90) */ 141 | 0x0f, 0x3c, /* 138: rgb(123, 0, 123) */ 142 | 0x15, 0x54, /* 139: rgb(173, 0, 173) */ 143 | 0x0b, 0x1c, /* 140: rgb( 58, 0, 90) */ 144 | 0x11, 0x2c, /* 141: rgb( 90, 0, 140) */ 145 | 0x17, 0x3c, /* 142: rgb(123, 0, 189) */ 146 | 0x1f, 0x54, /* 143: rgb(173, 0, 255) */ 147 | 0x60, 0x1c, /* 144: rgb( 58, 24, 0) */ 148 | 0xa0, 0x2c, /* 145: rgb( 90, 40, 0) */ 149 | 0xe0, 0x3c, /* 146: rgb(123, 57, 0) */ 150 | 0x40, 0x55, /* 147: rgb(173, 81, 0) */ 151 | 0x63, 0x1c, /* 148: rgb( 58, 24, 25) */ 152 | 0xa5, 0x2c, /* 149: rgb( 90, 40, 41) */ 153 | 0xe7, 0x3c, /* 150: rgb(123, 57, 58) */ 154 | 0x4a, 0x55, /* 151: rgb(173, 81, 82) */ 155 | 0x67, 0x1c, /* 152: rgb( 58, 24, 58) */ 156 | 0xab, 0x2c, /* 153: rgb( 90, 40, 90) */ 157 | 0xef, 0x3c, /* 154: rgb(123, 57, 123) */ 158 | 0x55, 0x55, /* 155: rgb(173, 81, 173) */ 159 | 0x6b, 0x1c, /* 156: rgb( 58, 24, 90) */ 160 | 0xb1, 0x2c, /* 157: rgb( 90, 40, 140) */ 161 | 0xf7, 0x3c, /* 158: rgb(123, 57, 189) */ 162 | 0x5f, 0x55, /* 159: rgb(173, 81, 255) */ 163 | 0xe0, 0x1c, /* 160: rgb( 58, 57, 0) */ 164 | 0x60, 0x2d, /* 161: rgb( 90, 89, 0) */ 165 | 0xe0, 0x3d, /* 162: rgb(123, 121, 0) */ 166 | 0xa0, 0x56, /* 163: rgb(173, 170, 0) */ 167 | 0xe3, 0x1c, /* 164: rgb( 58, 57, 25) */ 168 | 0x65, 0x2d, /* 165: rgb( 90, 89, 41) */ 169 | 0xe7, 0x3d, /* 166: rgb(123, 121, 58) */ 170 | 0xaa, 0x56, /* 167: rgb(173, 170, 82) */ 171 | 0xe7, 0x1c, /* 168: rgb( 58, 57, 58) */ 172 | 0x6b, 0x2d, /* 169: rgb( 90, 89, 90) */ 173 | 0xef, 0x3d, /* 170: rgb(123, 121, 123) */ 174 | 0xb5, 0x56, /* 171: rgb(173, 170, 173) */ 175 | 0xeb, 0x1c, /* 172: rgb( 58, 57, 90) */ 176 | 0x71, 0x2d, /* 173: rgb( 90, 89, 140) */ 177 | 0xf7, 0x3d, /* 174: rgb(123, 121, 189) */ 178 | 0xbf, 0x56, /* 175: rgb(173, 170, 255) */ 179 | 0x60, 0x1d, /* 176: rgb( 58, 89, 0) */ 180 | 0x20, 0x2e, /* 177: rgb( 90, 138, 0) */ 181 | 0xe0, 0x3e, /* 178: rgb(123, 186, 0) */ 182 | 0xe0, 0x57, /* 179: rgb(173, 251, 0) */ 183 | 0x63, 0x1d, /* 180: rgb( 58, 89, 25) */ 184 | 0x25, 0x2e, /* 181: rgb( 90, 138, 41) */ 185 | 0xe7, 0x3e, /* 182: rgb(123, 186, 58) */ 186 | 0xea, 0x57, /* 183: rgb(173, 251, 82) */ 187 | 0x67, 0x1d, /* 184: rgb( 58, 89, 58) */ 188 | 0x2b, 0x2e, /* 185: rgb( 90, 138, 90) */ 189 | 0xef, 0x3e, /* 186: rgb(123, 186, 123) */ 190 | 0xf5, 0x57, /* 187: rgb(173, 251, 173) */ 191 | 0x6b, 0x1d, /* 188: rgb( 58, 89, 90) */ 192 | 0x31, 0x2e, /* 189: rgb( 90, 138, 140) */ 193 | 0xf7, 0x3e, /* 190: rgb(123, 186, 189) */ 194 | 0xff, 0x57, /* 191: rgb(173, 251, 255) */ 195 | 0x00, 0x2c, /* 192: rgb( 90, 0, 0) */ 196 | 0x00, 0x44, /* 193: rgb(140, 0, 0) */ 197 | 0x00, 0x5c, /* 194: rgb(189, 0, 0) */ 198 | 0x00, 0x7c, /* 195: rgb(255, 0, 0) */ 199 | 0x03, 0x2c, /* 196: rgb( 90, 0, 25) */ 200 | 0x05, 0x44, /* 197: rgb(140, 0, 41) */ 201 | 0x07, 0x5c, /* 198: rgb(189, 0, 58) */ 202 | 0x0a, 0x7c, /* 199: rgb(255, 0, 82) */ 203 | 0x07, 0x2c, /* 200: rgb( 90, 0, 58) */ 204 | 0x0b, 0x44, /* 201: rgb(140, 0, 90) */ 205 | 0x0f, 0x5c, /* 202: rgb(189, 0, 123) */ 206 | 0x15, 0x7c, /* 203: rgb(255, 0, 173) */ 207 | 0x0b, 0x2c, /* 204: rgb( 90, 0, 90) */ 208 | 0x11, 0x44, /* 205: rgb(140, 0, 140) */ 209 | 0x17, 0x5c, /* 206: rgb(189, 0, 189) */ 210 | 0x1f, 0x7c, /* 207: rgb(255, 0, 255) */ 211 | 0x60, 0x2c, /* 208: rgb( 90, 24, 0) */ 212 | 0xa0, 0x44, /* 209: rgb(140, 40, 0) */ 213 | 0xe0, 0x5c, /* 210: rgb(189, 57, 0) */ 214 | 0x40, 0x7d, /* 211: rgb(255, 81, 0) */ 215 | 0x63, 0x2c, /* 212: rgb( 90, 24, 25) */ 216 | 0xa5, 0x44, /* 213: rgb(140, 40, 41) */ 217 | 0xe7, 0x5c, /* 214: rgb(189, 57, 58) */ 218 | 0x4a, 0x7d, /* 215: rgb(255, 81, 82) */ 219 | 0x67, 0x2c, /* 216: rgb( 90, 24, 58) */ 220 | 0xab, 0x44, /* 217: rgb(140, 40, 90) */ 221 | 0xef, 0x5c, /* 218: rgb(189, 57, 123) */ 222 | 0x55, 0x7d, /* 219: rgb(255, 81, 173) */ 223 | 0x6b, 0x2c, /* 220: rgb( 90, 24, 90) */ 224 | 0xb1, 0x44, /* 221: rgb(140, 40, 140) */ 225 | 0xf7, 0x5c, /* 222: rgb(189, 57, 189) */ 226 | 0x5f, 0x7d, /* 223: rgb(255, 81, 255) */ 227 | 0xe0, 0x2c, /* 224: rgb( 90, 57, 0) */ 228 | 0x60, 0x45, /* 225: rgb(140, 89, 0) */ 229 | 0xe0, 0x5d, /* 226: rgb(189, 121, 0) */ 230 | 0xa0, 0x7e, /* 227: rgb(255, 170, 0) */ 231 | 0xe3, 0x2c, /* 228: rgb( 90, 57, 25) */ 232 | 0x65, 0x45, /* 229: rgb(140, 89, 41) */ 233 | 0xe7, 0x5d, /* 230: rgb(189, 121, 58) */ 234 | 0xaa, 0x7e, /* 231: rgb(255, 170, 82) */ 235 | 0xe7, 0x2c, /* 232: rgb( 90, 57, 58) */ 236 | 0x6b, 0x45, /* 233: rgb(140, 89, 90) */ 237 | 0xef, 0x5d, /* 234: rgb(189, 121, 123) */ 238 | 0xb5, 0x7e, /* 235: rgb(255, 170, 173) */ 239 | 0xeb, 0x2c, /* 236: rgb( 90, 57, 90) */ 240 | 0x71, 0x45, /* 237: rgb(140, 89, 140) */ 241 | 0xf7, 0x5d, /* 238: rgb(189, 121, 189) */ 242 | 0xbf, 0x7e, /* 239: rgb(255, 170, 255) */ 243 | 0x60, 0x2d, /* 240: rgb( 90, 89, 0) */ 244 | 0x20, 0x46, /* 241: rgb(140, 138, 0) */ 245 | 0xe0, 0x5e, /* 242: rgb(189, 186, 0) */ 246 | 0xe0, 0x7f, /* 243: rgb(255, 251, 0) */ 247 | 0x63, 0x2d, /* 244: rgb( 90, 89, 25) */ 248 | 0x25, 0x46, /* 245: rgb(140, 138, 41) */ 249 | 0xe7, 0x5e, /* 246: rgb(189, 186, 58) */ 250 | 0xea, 0x7f, /* 247: rgb(255, 251, 82) */ 251 | 0x67, 0x2d, /* 248: rgb( 90, 89, 58) */ 252 | 0x2b, 0x46, /* 249: rgb(140, 138, 90) */ 253 | 0xef, 0x5e, /* 250: rgb(189, 186, 123) */ 254 | 0xf5, 0x7f, /* 251: rgb(255, 251, 173) */ 255 | 0x6b, 0x2d, /* 252: rgb( 90, 89, 90) */ 256 | 0x31, 0x46, /* 253: rgb(140, 138, 140) */ 257 | 0xf7, 0x5e, /* 254: rgb(189, 186, 189) */ 258 | 0xff, 0x7f, /* 255: rgb(255, 251, 255) */ 259 | }; 260 | -------------------------------------------------------------------------------- /src/gfx/global_palette.h: -------------------------------------------------------------------------------- 1 | #ifndef global_palette_include_file 2 | #define global_palette_include_file 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | #define sizeof_global_palette 512 9 | extern unsigned char global_palette[512]; 10 | 11 | #ifdef __cplusplus 12 | } 13 | #endif 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /src/gfx/rgbi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zaalan3/quad3D/215d84280883b8211a740c7d42a138e666a6a4f0/src/gfx/rgbi.png -------------------------------------------------------------------------------- /src/gfx/tileset.c: -------------------------------------------------------------------------------- 1 | unsigned char tileset_compressed[257] = 2 | { 3 | 0xe0,0x8e,0x00,0x1e,0xac,0xac,0xbe,0x00,0x04,0x00,0x98,0x07,0xac,0xff,0x8e,0x00,0x40,0x00,0x67,0x30,0x00,0xd3,0xf2,0x65,0xd3,0x00,0xd2,0xd2,0x07,0xfa,0x04,0x58, 4 | 0x06,0xf4,0x14,0xfb,0xfb,0xf9,0x18,0xff,0x4a,0x08,0xac,0x8e,0xf0,0x08,0x0d,0x00,0xff,0x49,0xd2,0x00,0x61,0xfb,0x28,0x88,0xca,0xf5,0x14,0xff,0x57,0x08,0x01,0xc4, 5 | 0xff,0x11,0xe8,0xff,0xbe,0x95,0xfe,0x2c,0xff,0x90,0xbe,0x1c,0x61,0xff,0x65,0xf3,0x2a,0xfa,0x7f,0x00,0x0a,0x00,0x12,0x19,0xac,0xb8,0x00,0x0e,0x34,0xff,0xde,0x82, 6 | 0xc1,0xf8,0xd2,0x2d,0x00,0x04,0xf2,0x57,0x1d,0x0b,0x01,0xe0,0xff,0x9b,0xf5,0x61,0xf4,0x2d,0x04,0xd2,0xfe,0xbe,0x03,0x81,0xff,0x27,0xfe,0x8c,0x86,0xe9,0xff,0x2c, 7 | 0xff,0x13,0xfb,0x85,0xff,0xc4,0xff,0x07,0x00,0xff,0x5a,0xfe,0x5d,0xfa,0x4e,0xff,0x91,0xf0,0x1f,0x1d,0xe9,0xff,0xa2,0xf1,0xac,0x68,0xf9,0xb5,0x81,0x40,0xfb,0x70, 8 | 0x06,0xff,0xfe,0x51,0x51,0xfc,0x9a,0x88,0xd3,0xe3,0xfe,0x03,0x97,0x84,0x69,0x81,0x50,0x00,0x1c,0x55,0xff,0x65,0xf6,0x30,0x83,0xf2,0x08,0xe5,0xf8,0xb4,0xfb,0x96, 9 | 0x87,0xbe,0x80,0xf0,0xff,0xaa,0xfe,0x4a,0xf7,0x49,0x42,0xff,0x03,0x8a,0xff,0x25,0xfd,0x4c,0xf7,0x29,0xfa,0x2d,0x00,0xe1,0xd7,0xfd,0x13,0x38,0xff,0x59,0x85,0xc0, 10 | 0x72,0x24,0xff,0xdb,0x81,0x6e,0x8b,0xfb,0x98,0xf7,0xa5,0xff,0x04,0xfb,0x07,0x8a,0xff,0x22,0xbe,0xa9,0x1c,0x0c,0xff,0x1c,0x00,0x00,0x80,0x01,0xc3,0x3a,0x00,0x00, 11 | 0x01 12 | }; 13 | -------------------------------------------------------------------------------- /src/gfx/tileset.h: -------------------------------------------------------------------------------- 1 | #ifndef tileset_include_file 2 | #define tileset_include_file 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | #define tileset_width 256 9 | #define tileset_height 128 10 | #define tileset_size 32768 11 | #define tileset_compressed_size 257 12 | extern unsigned char tileset_compressed[257]; 13 | 14 | #ifdef __cplusplus 15 | } 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /src/gfx/tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zaalan3/quad3D/215d84280883b8211a740c7d42a138e666a6a4f0/src/gfx/tileset.png -------------------------------------------------------------------------------- /src/grid.c: -------------------------------------------------------------------------------- 1 | //Model from grid.obj 2 | #include "quad/quad.h" 3 | 4 | 5 | static qdVertex verts[45]; 6 | static qdFace faces[32]; 7 | 8 | qdObject grid = {0,0,0,45,32,verts,faces,16,0}; 9 | 10 | static qdFace faces[32] = { 11 | {SHADER_TEXTURED,0xFF,0,0,0,1,10,9}, 12 | {SHADER_TEXTURED,0xFF,0,0,1,2,11,10}, 13 | {SHADER_TEXTURED,0xFF,0,0,2,3,12,11}, 14 | {SHADER_TEXTURED,0xFF,0,0,3,4,13,12}, 15 | {SHADER_TEXTURED,0xFF,0,0,4,5,14,13}, 16 | {SHADER_TEXTURED,0xFF,0,0,5,6,15,14}, 17 | {SHADER_TEXTURED,0xFF,0,0,6,7,16,15}, 18 | {SHADER_TEXTURED,0xFF,0,0,7,8,17,16}, 19 | {SHADER_TEXTURED,0xFF,0,0,9,10,19,18}, 20 | {SHADER_TEXTURED,0xFF,0,0,10,11,20,19}, 21 | {SHADER_TEXTURED,0xFF,0,0,11,12,21,20}, 22 | {SHADER_TEXTURED,0xFF,0,0,12,13,22,21}, 23 | {SHADER_TEXTURED,0xFF,0,0,13,14,23,22}, 24 | {SHADER_TEXTURED,0xFF,0,0,14,15,24,23}, 25 | {SHADER_TEXTURED,0xFF,0,0,15,16,25,24}, 26 | {SHADER_TEXTURED,0xFF,0,0,16,17,26,25}, 27 | {SHADER_TEXTURED,0xFF,0,0,18,19,28,27}, 28 | {SHADER_TEXTURED,0xFF,0,0,19,20,29,28}, 29 | {SHADER_TEXTURED,0xFF,0,0,20,21,30,29}, 30 | {SHADER_TEXTURED,0xFF,0,0,21,22,31,30}, 31 | {SHADER_TEXTURED,0xFF,0,0,22,23,32,31}, 32 | {SHADER_TEXTURED,0xFF,0,0,23,24,33,32}, 33 | {SHADER_TEXTURED,0xFF,0,0,24,25,34,33}, 34 | {SHADER_TEXTURED,0xFF,0,0,25,26,35,34}, 35 | {SHADER_TEXTURED,0xFF,0,0,27,28,37,36}, 36 | {SHADER_TEXTURED,0xFF,0,0,28,29,38,37}, 37 | {SHADER_TEXTURED,0xFF,0,0,29,30,39,38}, 38 | {SHADER_TEXTURED,0xFF,0,0,30,31,40,39}, 39 | {SHADER_TEXTURED,0xFF,0,0,31,32,41,40}, 40 | {SHADER_TEXTURED,0xFF,0,0,32,33,42,41}, 41 | {SHADER_TEXTURED,0xFF,0,0,33,34,43,42}, 42 | {SHADER_TEXTURED,0xFF,0,0,34,35,44,43} 43 | }; 44 | static qdVertex verts[45] = { 45 | {96,128,128}, 46 | {104,128,128}, 47 | {112,128,128}, 48 | {120,128,128}, 49 | {128,128,128}, 50 | {136,128,128}, 51 | {144,128,128}, 52 | {152,128,128}, 53 | {160,128,128}, 54 | {96,128,120}, 55 | {104,128,120}, 56 | {112,128,120}, 57 | {120,128,120}, 58 | {128,128,120}, 59 | {136,128,120}, 60 | {144,128,120}, 61 | {152,128,120}, 62 | {160,128,120}, 63 | {96,128,112}, 64 | {104,128,112}, 65 | {112,128,112}, 66 | {120,128,112}, 67 | {128,128,112}, 68 | {136,128,112}, 69 | {144,128,112}, 70 | {152,128,112}, 71 | {160,128,112}, 72 | {96,128,104}, 73 | {104,128,104}, 74 | {112,128,104}, 75 | {120,128,104}, 76 | {128,128,104}, 77 | {136,128,104}, 78 | {144,128,104}, 79 | {152,128,104}, 80 | {160,128,104}, 81 | {96,128,96}, 82 | {104,128,96}, 83 | {112,128,96}, 84 | {120,128,96}, 85 | {128,128,96}, 86 | {136,128,96}, 87 | {144,128,96}, 88 | {152,128,96}, 89 | {160,128,96} 90 | }; 91 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | /* Standard headers (recommended) */ 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | 15 | #include "quad/quad.h" 16 | #include "gfx/gfx.h" 17 | 18 | extern qdObject grid; 19 | extern qdObject monkey; 20 | extern qdObject zelda; 21 | 22 | qdObject active; 23 | qdVertex tempVerts[550]; 24 | 25 | qdSprite spr = {0,20,-30,0,0,spriteSize(16),spriteSize(16)}; 26 | qdSprite spr2 = {20,20,-30,16,0,spriteSize(32),spriteSize(16)}; 27 | 28 | int main(void) 29 | { 30 | uint16_t ay = 512; 31 | uint16_t ax = 0; 32 | uint16_t az = 0; 33 | 34 | uint16_t ty = 0; 35 | uint8_t upTimer = 0; 36 | qdMatrix tempMatrix = {0}; 37 | bool last5 = false; 38 | 39 | active = grid; 40 | active.vertex = tempVerts; 41 | qdSprite sprites[2] = {spr,spr2}; 42 | qdObject* currentModel = &grid; 43 | 44 | qdInit(); 45 | loadTextureMapCompressed(0,tileset_compressed); 46 | gfx_SetPalette(global_palette,sizeof_global_palette,0); 47 | 48 | qdSetCameraPosition(0,16,40); 49 | 50 | gfx_SetColor(0xFF); 51 | // white box to show bounds of rendering area 52 | gfx_HorizLine(80,59,160); 53 | gfx_HorizLine(80,180,160); 54 | gfx_VertLine(79,60,120); 55 | gfx_VertLine(240,60,120); 56 | gfx_SetTextBGColor(0x00); 57 | gfx_SetTextFGColor(0xFF); 58 | gfx_SetTextTransparentColor(0xFE); 59 | gfx_SetColor(0xFF); 60 | 61 | // model showcase loop 62 | kb_SetMode(MODE_3_CONTINUOUS); 63 | while(!kb_IsDown(kb_KeyClear)) { 64 | qdSetCameraAngle(ax,ay,az); 65 | 66 | if(kb_IsDown(kb_Key4)) { 67 | qdCameraMatrix.x--; 68 | } else if(kb_IsDown(kb_Key6)) { 69 | qdCameraMatrix.x++; 70 | } 71 | 72 | if(kb_IsDown(kb_KeyUp)) { 73 | qdCameraMatrix.y++; 74 | } else if(kb_IsDown(kb_KeyDown)) { 75 | qdCameraMatrix.y--; 76 | } 77 | 78 | if(kb_IsDown(kb_Key8)) { 79 | qdCameraMatrix.z--; 80 | } else if(kb_IsDown(kb_Key2)) { 81 | qdCameraMatrix.z++; 82 | } 83 | 84 | if(kb_IsDown(kb_KeyLeft)) { 85 | ay+=3; 86 | } else if(kb_IsDown(kb_KeyRight)) { 87 | ay-=3; 88 | } 89 | 90 | 91 | if(kb_IsDown(kb_Key5) && !last5) { 92 | 93 | if(currentModel == &grid) { 94 | active = zelda; 95 | active.vertex = tempVerts; 96 | currentModel = &zelda; 97 | } else if(currentModel == &zelda) { 98 | active = monkey; 99 | active.vertex = tempVerts; 100 | currentModel = &monkey; 101 | } else { 102 | active = grid; 103 | active.vertex = tempVerts; 104 | currentModel = &grid; 105 | } 106 | 107 | last5 = true; 108 | } else if ( !kb_IsDown(kb_Key5) ) { 109 | last5 = false; 110 | } 111 | 112 | 113 | qdEulerToMatrix(&tempMatrix,0,ty,0); 114 | ty += 8; 115 | 116 | timer_Set(1,0); 117 | timer_Enable(1,TIMER_CPU,TIMER_NOINT,TIMER_UP); 118 | 119 | qdTransformVertices(&tempMatrix,currentModel->vertex,tempVerts,active.numVerts); 120 | 121 | timer_Disable(1); 122 | int time1 = timer_Get(1); 123 | 124 | 125 | if(upTimer++ == 60) { 126 | if (active.uOffset == 32) 127 | active.uOffset = 0; 128 | else 129 | active.uOffset += 16; 130 | 131 | upTimer = 0; 132 | } 133 | 134 | qdClearCanvas(); 135 | 136 | timer_Set(1,0); 137 | timer_Enable(1,TIMER_CPU,TIMER_NOINT,TIMER_UP); 138 | qdRenderObject(&active); 139 | qdRenderSprites(sprites,2); 140 | gfx_SetTextXY(100,0); 141 | gfx_PrintUInt(*((uint24_t*)0xE30B80),3); // # faces drawn 142 | qdDraw(); 143 | 144 | timer_Disable(1); 145 | int time2 = timer_Get(1); 146 | 147 | gfx_Wait(); 148 | qdBlitCanvas(&gfx_vbuffer[60][80]); 149 | 150 | gfx_SetTextXY(1,0); 151 | gfx_PrintUInt(time2,8); 152 | gfx_SetTextXY(70,0); 153 | gfx_PrintUInt(active.numVerts,3); 154 | gfx_SetTextXY(280,0); 155 | gfx_PrintUInt(ay,3); 156 | gfx_SetTextXY(0,16); 157 | gfx_PrintUInt(time1,8); 158 | 159 | } 160 | 161 | qdClose(); 162 | } 163 | -------------------------------------------------------------------------------- /src/monkey.c: -------------------------------------------------------------------------------- 1 | //Model from monkey.obj 2 | #include "quad/quad.h" 3 | 4 | static qdVertex verts[507]; 5 | static qdFace faces[500]; 6 | qdObject monkey = {0,0,0,507,500,verts,faces,0,0}; 7 | static qdFace faces[500] = { 8 | {SHADER_TEXTURED,0xFF,0,0,46,0,2,44}, 9 | {SHADER_TEXTURED,0xFF,0,0,3,1,47,45}, 10 | {SHADER_TEXTURED,0xFF,0,0,44,2,4,42}, 11 | {SHADER_TEXTURED,0xFF,0,0,5,3,45,43}, 12 | {SHADER_TEXTURED,0xFF,0,0,2,8,6,4}, 13 | {SHADER_TEXTURED,0xFF,0,0,7,9,3,5}, 14 | {SHADER_TEXTURED,0xFF,0,0,0,10,8,2}, 15 | {SHADER_TEXTURED,0xFF,0,0,9,11,1,3}, 16 | {SHADER_TEXTURED,0xFF,0,0,10,12,14,8}, 17 | {SHADER_TEXTURED,0xFF,0,0,15,13,11,9}, 18 | {SHADER_TEXTURED,0xFF,0,0,8,14,16,6}, 19 | {SHADER_TEXTURED,0xFF,0,0,17,15,9,7}, 20 | {SHADER_TEXTURED,0xFF,0,0,14,20,18,16}, 21 | {SHADER_TEXTURED,0xFF,0,0,19,21,15,17}, 22 | {SHADER_TEXTURED,0xFF,0,0,12,22,20,14}, 23 | {SHADER_TEXTURED,0xFF,0,0,21,23,13,15}, 24 | {SHADER_TEXTURED,0xFF,0,0,22,24,26,20}, 25 | {SHADER_TEXTURED,0xFF,0,0,27,25,23,21}, 26 | {SHADER_TEXTURED,0xFF,0,0,20,26,28,18}, 27 | {SHADER_TEXTURED,0xFF,0,0,29,27,21,19}, 28 | {SHADER_TEXTURED,0xFF,0,0,26,32,30,28}, 29 | {SHADER_TEXTURED,0xFF,0,0,31,33,27,29}, 30 | {SHADER_TEXTURED,0xFF,0,0,24,34,32,26}, 31 | {SHADER_TEXTURED,0xFF,0,0,33,35,25,27}, 32 | {SHADER_TEXTURED,0xFF,0,0,34,36,38,32}, 33 | {SHADER_TEXTURED,0xFF,0,0,39,37,35,33}, 34 | {SHADER_TEXTURED,0xFF,0,0,32,38,40,30}, 35 | {SHADER_TEXTURED,0xFF,0,0,41,39,33,31}, 36 | {SHADER_TEXTURED,0xFF,0,0,38,44,42,40}, 37 | {SHADER_TEXTURED,0xFF,0,0,43,45,39,41}, 38 | {SHADER_TEXTURED,0xFF,0,0,36,46,44,38}, 39 | {SHADER_TEXTURED,0xFF,0,0,45,47,37,39}, 40 | {SHADER_TEXTURED,0xFF,0,0,46,36,50,48}, 41 | {SHADER_TEXTURED,0xFF,0,0,51,37,47,49}, 42 | {SHADER_TEXTURED,0xFF,0,0,36,34,52,50}, 43 | {SHADER_TEXTURED,0xFF,0,0,53,35,37,51}, 44 | {SHADER_TEXTURED,0xFF,0,0,34,24,54,52}, 45 | {SHADER_TEXTURED,0xFF,0,0,55,25,35,53}, 46 | {SHADER_TEXTURED,0xFF,0,0,24,22,56,54}, 47 | {SHADER_TEXTURED,0xFF,0,0,57,23,25,55}, 48 | {SHADER_TEXTURED,0xFF,0,0,22,12,58,56}, 49 | {SHADER_TEXTURED,0xFF,0,0,59,13,23,57}, 50 | {SHADER_TEXTURED,0xFF,0,0,12,10,62,58}, 51 | {SHADER_TEXTURED,0xFF,0,0,63,11,13,59}, 52 | {SHADER_TEXTURED,0xFF,0,0,10,0,64,62}, 53 | {SHADER_TEXTURED,0xFF,0,0,65,1,11,63}, 54 | {SHADER_TEXTURED,0xFF,0,0,0,46,48,64}, 55 | {SHADER_TEXTURED,0xFF,0,0,49,47,1,65}, 56 | {SHADER_TEXTURED,0xFF,0,0,60,64,48,48}, 57 | {SHADER_TEXTURED,0xFF,0,0,49,65,61,61}, 58 | {SHADER_TEXTURED,0xFF,0,0,62,64,60,60}, 59 | {SHADER_TEXTURED,0xFF,0,0,61,65,63,63}, 60 | {SHADER_TEXTURED,0xFF,0,0,60,58,62,62}, 61 | {SHADER_TEXTURED,0xFF,0,0,63,59,61,61}, 62 | {SHADER_TEXTURED,0xFF,0,0,60,56,58,58}, 63 | {SHADER_TEXTURED,0xFF,0,0,59,57,61,61}, 64 | {SHADER_TEXTURED,0xFF,0,0,60,54,56,56}, 65 | {SHADER_TEXTURED,0xFF,0,0,57,55,61,61}, 66 | {SHADER_TEXTURED,0xFF,0,0,60,52,54,54}, 67 | {SHADER_TEXTURED,0xFF,0,0,55,53,61,61}, 68 | {SHADER_TEXTURED,0xFF,0,0,60,50,52,52}, 69 | {SHADER_TEXTURED,0xFF,0,0,53,51,61,61}, 70 | {SHADER_TEXTURED,0xFF,0,0,60,48,50,50}, 71 | {SHADER_TEXTURED,0xFF,0,0,51,49,61,61}, 72 | {SHADER_TEXTURED,0xFF,0,0,88,173,175,90}, 73 | {SHADER_TEXTURED,0xFF,0,0,175,174,89,90}, 74 | {SHADER_TEXTURED,0xFF,0,0,86,171,173,88}, 75 | {SHADER_TEXTURED,0xFF,0,0,174,172,87,89}, 76 | {SHADER_TEXTURED,0xFF,0,0,84,169,171,86}, 77 | {SHADER_TEXTURED,0xFF,0,0,172,170,85,87}, 78 | {SHADER_TEXTURED,0xFF,0,0,82,167,169,84}, 79 | {SHADER_TEXTURED,0xFF,0,0,170,168,83,85}, 80 | {SHADER_TEXTURED,0xFF,0,0,80,165,167,82}, 81 | {SHADER_TEXTURED,0xFF,0,0,168,166,81,83}, 82 | {SHADER_TEXTURED,0xFF,0,0,78,91,145,163}, 83 | {SHADER_TEXTURED,0xFF,0,0,146,92,79,164}, 84 | {SHADER_TEXTURED,0xFF,0,0,91,93,147,145}, 85 | {SHADER_TEXTURED,0xFF,0,0,148,94,92,146}, 86 | {SHADER_TEXTURED,0xFF,0,0,93,95,149,147}, 87 | {SHADER_TEXTURED,0xFF,0,0,150,96,94,148}, 88 | {SHADER_TEXTURED,0xFF,0,0,95,97,151,149}, 89 | {SHADER_TEXTURED,0xFF,0,0,152,98,96,150}, 90 | {SHADER_TEXTURED,0xFF,0,0,97,99,153,151}, 91 | {SHADER_TEXTURED,0xFF,0,0,154,100,98,152}, 92 | {SHADER_TEXTURED,0xFF,0,0,99,101,155,153}, 93 | {SHADER_TEXTURED,0xFF,0,0,156,102,100,154}, 94 | {SHADER_TEXTURED,0xFF,0,0,101,103,157,155}, 95 | {SHADER_TEXTURED,0xFF,0,0,158,104,102,156}, 96 | {SHADER_TEXTURED,0xFF,0,0,103,105,159,157}, 97 | {SHADER_TEXTURED,0xFF,0,0,160,106,104,158}, 98 | {SHADER_TEXTURED,0xFF,0,0,105,107,161,159}, 99 | {SHADER_TEXTURED,0xFF,0,0,162,108,106,160}, 100 | {SHADER_TEXTURED,0xFF,0,0,107,66,67,161}, 101 | {SHADER_TEXTURED,0xFF,0,0,67,66,108,162}, 102 | {SHADER_TEXTURED,0xFF,0,0,109,127,159,161}, 103 | {SHADER_TEXTURED,0xFF,0,0,160,128,110,162}, 104 | {SHADER_TEXTURED,0xFF,0,0,127,178,157,159}, 105 | {SHADER_TEXTURED,0xFF,0,0,158,179,128,160}, 106 | {SHADER_TEXTURED,0xFF,0,0,125,155,157,178}, 107 | {SHADER_TEXTURED,0xFF,0,0,158,156,126,179}, 108 | {SHADER_TEXTURED,0xFF,0,0,123,153,155,125}, 109 | {SHADER_TEXTURED,0xFF,0,0,156,154,124,126}, 110 | {SHADER_TEXTURED,0xFF,0,0,121,151,153,123}, 111 | {SHADER_TEXTURED,0xFF,0,0,154,152,122,124}, 112 | {SHADER_TEXTURED,0xFF,0,0,119,149,151,121}, 113 | {SHADER_TEXTURED,0xFF,0,0,152,150,120,122}, 114 | {SHADER_TEXTURED,0xFF,0,0,117,147,149,119}, 115 | {SHADER_TEXTURED,0xFF,0,0,150,148,118,120}, 116 | {SHADER_TEXTURED,0xFF,0,0,115,145,147,117}, 117 | {SHADER_TEXTURED,0xFF,0,0,148,146,116,118}, 118 | {SHADER_TEXTURED,0xFF,0,0,113,163,145,115}, 119 | {SHADER_TEXTURED,0xFF,0,0,146,164,114,116}, 120 | {SHADER_TEXTURED,0xFF,0,0,113,180,176,163}, 121 | {SHADER_TEXTURED,0xFF,0,0,176,181,114,164}, 122 | {SHADER_TEXTURED,0xFF,0,0,109,161,67,111}, 123 | {SHADER_TEXTURED,0xFF,0,0,67,162,110,112}, 124 | {SHADER_TEXTURED,0xFF,0,0,111,67,177,182}, 125 | {SHADER_TEXTURED,0xFF,0,0,177,67,112,183}, 126 | {SHADER_TEXTURED,0xFF,0,0,176,180,182,177}, 127 | {SHADER_TEXTURED,0xFF,0,0,183,181,176,177}, 128 | {SHADER_TEXTURED,0xFF,0,0,134,136,175,173}, 129 | {SHADER_TEXTURED,0xFF,0,0,175,136,135,174}, 130 | {SHADER_TEXTURED,0xFF,0,0,132,134,173,171}, 131 | {SHADER_TEXTURED,0xFF,0,0,174,135,133,172}, 132 | {SHADER_TEXTURED,0xFF,0,0,130,132,171,169}, 133 | {SHADER_TEXTURED,0xFF,0,0,172,133,131,170}, 134 | {SHADER_TEXTURED,0xFF,0,0,165,186,184,167}, 135 | {SHADER_TEXTURED,0xFF,0,0,185,187,166,168}, 136 | {SHADER_TEXTURED,0xFF,0,0,130,169,167,184}, 137 | {SHADER_TEXTURED,0xFF,0,0,168,170,131,185}, 138 | {SHADER_TEXTURED,0xFF,0,0,143,189,188,186}, 139 | {SHADER_TEXTURED,0xFF,0,0,188,189,144,187}, 140 | {SHADER_TEXTURED,0xFF,0,0,184,186,188,68}, 141 | {SHADER_TEXTURED,0xFF,0,0,188,187,185,68}, 142 | {SHADER_TEXTURED,0xFF,0,0,129,130,184,68}, 143 | {SHADER_TEXTURED,0xFF,0,0,185,131,129,68}, 144 | {SHADER_TEXTURED,0xFF,0,0,141,192,190,143}, 145 | {SHADER_TEXTURED,0xFF,0,0,191,193,142,144}, 146 | {SHADER_TEXTURED,0xFF,0,0,139,194,192,141}, 147 | {SHADER_TEXTURED,0xFF,0,0,193,195,140,142}, 148 | {SHADER_TEXTURED,0xFF,0,0,138,196,194,139}, 149 | {SHADER_TEXTURED,0xFF,0,0,195,197,138,140}, 150 | {SHADER_TEXTURED,0xFF,0,0,137,70,196,138}, 151 | {SHADER_TEXTURED,0xFF,0,0,197,70,137,138}, 152 | {SHADER_TEXTURED,0xFF,0,0,189,143,190,69}, 153 | {SHADER_TEXTURED,0xFF,0,0,191,144,189,69}, 154 | {SHADER_TEXTURED,0xFF,0,0,69,190,205,207}, 155 | {SHADER_TEXTURED,0xFF,0,0,206,191,69,207}, 156 | {SHADER_TEXTURED,0xFF,0,0,70,198,199,196}, 157 | {SHADER_TEXTURED,0xFF,0,0,200,198,70,197}, 158 | {SHADER_TEXTURED,0xFF,0,0,196,199,201,194}, 159 | {SHADER_TEXTURED,0xFF,0,0,202,200,197,195}, 160 | {SHADER_TEXTURED,0xFF,0,0,194,201,203,192}, 161 | {SHADER_TEXTURED,0xFF,0,0,204,202,195,193}, 162 | {SHADER_TEXTURED,0xFF,0,0,192,203,205,190}, 163 | {SHADER_TEXTURED,0xFF,0,0,206,204,193,191}, 164 | {SHADER_TEXTURED,0xFF,0,0,198,203,201,199}, 165 | {SHADER_TEXTURED,0xFF,0,0,202,204,198,200}, 166 | {SHADER_TEXTURED,0xFF,0,0,198,207,205,203}, 167 | {SHADER_TEXTURED,0xFF,0,0,206,207,198,204}, 168 | {SHADER_TEXTURED,0xFF,0,0,138,139,163,176}, 169 | {SHADER_TEXTURED,0xFF,0,0,164,140,138,176}, 170 | {SHADER_TEXTURED,0xFF,0,0,139,141,210,163}, 171 | {SHADER_TEXTURED,0xFF,0,0,211,142,140,164}, 172 | {SHADER_TEXTURED,0xFF,0,0,141,143,212,210}, 173 | {SHADER_TEXTURED,0xFF,0,0,213,144,142,211}, 174 | {SHADER_TEXTURED,0xFF,0,0,143,186,165,212}, 175 | {SHADER_TEXTURED,0xFF,0,0,166,187,144,213}, 176 | {SHADER_TEXTURED,0xFF,0,0,80,208,212,165}, 177 | {SHADER_TEXTURED,0xFF,0,0,213,209,81,166}, 178 | {SHADER_TEXTURED,0xFF,0,0,208,214,210,212}, 179 | {SHADER_TEXTURED,0xFF,0,0,211,215,209,213}, 180 | {SHADER_TEXTURED,0xFF,0,0,78,163,210,214}, 181 | {SHADER_TEXTURED,0xFF,0,0,211,164,79,215}, 182 | {SHADER_TEXTURED,0xFF,0,0,130,129,71,221}, 183 | {SHADER_TEXTURED,0xFF,0,0,71,129,131,222}, 184 | {SHADER_TEXTURED,0xFF,0,0,132,130,221,219}, 185 | {SHADER_TEXTURED,0xFF,0,0,222,131,133,220}, 186 | {SHADER_TEXTURED,0xFF,0,0,134,132,219,217}, 187 | {SHADER_TEXTURED,0xFF,0,0,220,133,135,218}, 188 | {SHADER_TEXTURED,0xFF,0,0,136,134,217,216}, 189 | {SHADER_TEXTURED,0xFF,0,0,218,135,136,216}, 190 | {SHADER_TEXTURED,0xFF,0,0,216,217,228,230}, 191 | {SHADER_TEXTURED,0xFF,0,0,229,218,216,230}, 192 | {SHADER_TEXTURED,0xFF,0,0,217,219,226,228}, 193 | {SHADER_TEXTURED,0xFF,0,0,227,220,218,229}, 194 | {SHADER_TEXTURED,0xFF,0,0,219,221,224,226}, 195 | {SHADER_TEXTURED,0xFF,0,0,225,222,220,227}, 196 | {SHADER_TEXTURED,0xFF,0,0,221,71,223,224}, 197 | {SHADER_TEXTURED,0xFF,0,0,223,71,222,225}, 198 | {SHADER_TEXTURED,0xFF,0,0,223,230,228,224}, 199 | {SHADER_TEXTURED,0xFF,0,0,229,230,223,225}, 200 | {SHADER_TEXTURED,0xFF,0,0,224,228,226,226}, 201 | {SHADER_TEXTURED,0xFF,0,0,227,229,225,225}, 202 | {SHADER_TEXTURED,0xFF,0,0,182,180,233,231}, 203 | {SHADER_TEXTURED,0xFF,0,0,234,181,183,232}, 204 | {SHADER_TEXTURED,0xFF,0,0,111,182,231,253}, 205 | {SHADER_TEXTURED,0xFF,0,0,232,183,112,254}, 206 | {SHADER_TEXTURED,0xFF,0,0,109,111,253,255}, 207 | {SHADER_TEXTURED,0xFF,0,0,254,112,110,256}, 208 | {SHADER_TEXTURED,0xFF,0,0,180,113,251,233}, 209 | {SHADER_TEXTURED,0xFF,0,0,252,114,181,234}, 210 | {SHADER_TEXTURED,0xFF,0,0,113,115,249,251}, 211 | {SHADER_TEXTURED,0xFF,0,0,250,116,114,252}, 212 | {SHADER_TEXTURED,0xFF,0,0,115,117,247,249}, 213 | {SHADER_TEXTURED,0xFF,0,0,248,118,116,250}, 214 | {SHADER_TEXTURED,0xFF,0,0,117,119,245,247}, 215 | {SHADER_TEXTURED,0xFF,0,0,246,120,118,248}, 216 | {SHADER_TEXTURED,0xFF,0,0,119,121,243,245}, 217 | {SHADER_TEXTURED,0xFF,0,0,244,122,120,246}, 218 | {SHADER_TEXTURED,0xFF,0,0,121,123,241,243}, 219 | {SHADER_TEXTURED,0xFF,0,0,242,124,122,244}, 220 | {SHADER_TEXTURED,0xFF,0,0,123,125,239,241}, 221 | {SHADER_TEXTURED,0xFF,0,0,240,126,124,242}, 222 | {SHADER_TEXTURED,0xFF,0,0,125,178,235,239}, 223 | {SHADER_TEXTURED,0xFF,0,0,236,179,126,240}, 224 | {SHADER_TEXTURED,0xFF,0,0,178,127,237,235}, 225 | {SHADER_TEXTURED,0xFF,0,0,238,128,179,236}, 226 | {SHADER_TEXTURED,0xFF,0,0,127,109,255,237}, 227 | {SHADER_TEXTURED,0xFF,0,0,256,110,128,238}, 228 | {SHADER_TEXTURED,0xFF,0,0,237,255,257,275}, 229 | {SHADER_TEXTURED,0xFF,0,0,258,256,238,276}, 230 | {SHADER_TEXTURED,0xFF,0,0,235,237,275,277}, 231 | {SHADER_TEXTURED,0xFF,0,0,276,238,236,278}, 232 | {SHADER_TEXTURED,0xFF,0,0,239,235,277,273}, 233 | {SHADER_TEXTURED,0xFF,0,0,278,236,240,274}, 234 | {SHADER_TEXTURED,0xFF,0,0,241,239,273,271}, 235 | {SHADER_TEXTURED,0xFF,0,0,274,240,242,272}, 236 | {SHADER_TEXTURED,0xFF,0,0,243,241,271,269}, 237 | {SHADER_TEXTURED,0xFF,0,0,272,242,244,270}, 238 | {SHADER_TEXTURED,0xFF,0,0,245,243,269,267}, 239 | {SHADER_TEXTURED,0xFF,0,0,270,244,246,268}, 240 | {SHADER_TEXTURED,0xFF,0,0,247,245,267,265}, 241 | {SHADER_TEXTURED,0xFF,0,0,268,246,248,266}, 242 | {SHADER_TEXTURED,0xFF,0,0,249,247,265,263}, 243 | {SHADER_TEXTURED,0xFF,0,0,266,248,250,264}, 244 | {SHADER_TEXTURED,0xFF,0,0,251,249,263,261}, 245 | {SHADER_TEXTURED,0xFF,0,0,264,250,252,262}, 246 | {SHADER_TEXTURED,0xFF,0,0,233,251,261,279}, 247 | {SHADER_TEXTURED,0xFF,0,0,262,252,234,280}, 248 | {SHADER_TEXTURED,0xFF,0,0,255,253,259,257}, 249 | {SHADER_TEXTURED,0xFF,0,0,260,254,256,258}, 250 | {SHADER_TEXTURED,0xFF,0,0,253,231,281,259}, 251 | {SHADER_TEXTURED,0xFF,0,0,282,232,254,260}, 252 | {SHADER_TEXTURED,0xFF,0,0,231,233,279,281}, 253 | {SHADER_TEXTURED,0xFF,0,0,280,234,232,282}, 254 | {SHADER_TEXTURED,0xFF,0,0,66,107,283,72}, 255 | {SHADER_TEXTURED,0xFF,0,0,284,108,66,72}, 256 | {SHADER_TEXTURED,0xFF,0,0,107,105,285,283}, 257 | {SHADER_TEXTURED,0xFF,0,0,286,106,108,284}, 258 | {SHADER_TEXTURED,0xFF,0,0,105,103,287,285}, 259 | {SHADER_TEXTURED,0xFF,0,0,288,104,106,286}, 260 | {SHADER_TEXTURED,0xFF,0,0,103,101,289,287}, 261 | {SHADER_TEXTURED,0xFF,0,0,290,102,104,288}, 262 | {SHADER_TEXTURED,0xFF,0,0,101,99,291,289}, 263 | {SHADER_TEXTURED,0xFF,0,0,292,100,102,290}, 264 | {SHADER_TEXTURED,0xFF,0,0,99,97,293,291}, 265 | {SHADER_TEXTURED,0xFF,0,0,294,98,100,292}, 266 | {SHADER_TEXTURED,0xFF,0,0,97,95,295,293}, 267 | {SHADER_TEXTURED,0xFF,0,0,296,96,98,294}, 268 | {SHADER_TEXTURED,0xFF,0,0,95,93,297,295}, 269 | {SHADER_TEXTURED,0xFF,0,0,298,94,96,296}, 270 | {SHADER_TEXTURED,0xFF,0,0,93,91,299,297}, 271 | {SHADER_TEXTURED,0xFF,0,0,300,92,94,298}, 272 | {SHADER_TEXTURED,0xFF,0,0,307,308,327,337}, 273 | {SHADER_TEXTURED,0xFF,0,0,328,308,307,338}, 274 | {SHADER_TEXTURED,0xFF,0,0,306,307,337,335}, 275 | {SHADER_TEXTURED,0xFF,0,0,338,307,306,336}, 276 | {SHADER_TEXTURED,0xFF,0,0,305,306,335,339}, 277 | {SHADER_TEXTURED,0xFF,0,0,336,306,305,340}, 278 | {SHADER_TEXTURED,0xFF,0,0,88,90,305,339}, 279 | {SHADER_TEXTURED,0xFF,0,0,305,90,89,340}, 280 | {SHADER_TEXTURED,0xFF,0,0,86,88,339,333}, 281 | {SHADER_TEXTURED,0xFF,0,0,340,89,87,334}, 282 | {SHADER_TEXTURED,0xFF,0,0,84,86,333,329}, 283 | {SHADER_TEXTURED,0xFF,0,0,334,87,85,330}, 284 | {SHADER_TEXTURED,0xFF,0,0,82,84,329,331}, 285 | {SHADER_TEXTURED,0xFF,0,0,330,85,83,332}, 286 | {SHADER_TEXTURED,0xFF,0,0,329,335,337,331}, 287 | {SHADER_TEXTURED,0xFF,0,0,338,336,330,332}, 288 | {SHADER_TEXTURED,0xFF,0,0,329,333,339,335}, 289 | {SHADER_TEXTURED,0xFF,0,0,340,334,330,336}, 290 | {SHADER_TEXTURED,0xFF,0,0,325,331,337,327}, 291 | {SHADER_TEXTURED,0xFF,0,0,338,332,326,328}, 292 | {SHADER_TEXTURED,0xFF,0,0,80,82,331,325}, 293 | {SHADER_TEXTURED,0xFF,0,0,332,83,81,326}, 294 | {SHADER_TEXTURED,0xFF,0,0,208,341,343,214}, 295 | {SHADER_TEXTURED,0xFF,0,0,344,342,209,215}, 296 | {SHADER_TEXTURED,0xFF,0,0,80,325,341,208}, 297 | {SHADER_TEXTURED,0xFF,0,0,342,326,81,209}, 298 | {SHADER_TEXTURED,0xFF,0,0,78,214,343,345}, 299 | {SHADER_TEXTURED,0xFF,0,0,344,215,79,346}, 300 | {SHADER_TEXTURED,0xFF,0,0,78,345,299,91}, 301 | {SHADER_TEXTURED,0xFF,0,0,300,346,79,92}, 302 | {SHADER_TEXTURED,0xFF,0,0,76,323,351,303}, 303 | {SHADER_TEXTURED,0xFF,0,0,352,324,76,303}, 304 | {SHADER_TEXTURED,0xFF,0,0,303,351,349,77}, 305 | {SHADER_TEXTURED,0xFF,0,0,350,352,303,77}, 306 | {SHADER_TEXTURED,0xFF,0,0,77,349,347,304}, 307 | {SHADER_TEXTURED,0xFF,0,0,348,350,77,304}, 308 | {SHADER_TEXTURED,0xFF,0,0,304,347,327,308}, 309 | {SHADER_TEXTURED,0xFF,0,0,328,348,304,308}, 310 | {SHADER_TEXTURED,0xFF,0,0,325,327,347,341}, 311 | {SHADER_TEXTURED,0xFF,0,0,348,328,326,342}, 312 | {SHADER_TEXTURED,0xFF,0,0,295,297,317,309}, 313 | {SHADER_TEXTURED,0xFF,0,0,318,298,296,310}, 314 | {SHADER_TEXTURED,0xFF,0,0,75,315,323,76}, 315 | {SHADER_TEXTURED,0xFF,0,0,324,316,75,76}, 316 | {SHADER_TEXTURED,0xFF,0,0,301,357,355,302}, 317 | {SHADER_TEXTURED,0xFF,0,0,356,358,301,302}, 318 | {SHADER_TEXTURED,0xFF,0,0,302,355,353,74}, 319 | {SHADER_TEXTURED,0xFF,0,0,354,356,302,74}, 320 | {SHADER_TEXTURED,0xFF,0,0,74,353,315,75}, 321 | {SHADER_TEXTURED,0xFF,0,0,316,354,74,75}, 322 | {SHADER_TEXTURED,0xFF,0,0,291,293,361,363}, 323 | {SHADER_TEXTURED,0xFF,0,0,362,294,292,364}, 324 | {SHADER_TEXTURED,0xFF,0,0,363,361,367,365}, 325 | {SHADER_TEXTURED,0xFF,0,0,368,362,364,366}, 326 | {SHADER_TEXTURED,0xFF,0,0,365,367,369,371}, 327 | {SHADER_TEXTURED,0xFF,0,0,370,368,366,372}, 328 | {SHADER_TEXTURED,0xFF,0,0,371,369,375,373}, 329 | {SHADER_TEXTURED,0xFF,0,0,376,370,372,374}, 330 | {SHADER_TEXTURED,0xFF,0,0,313,377,373,375}, 331 | {SHADER_TEXTURED,0xFF,0,0,374,378,314,376}, 332 | {SHADER_TEXTURED,0xFF,0,0,315,353,373,377}, 333 | {SHADER_TEXTURED,0xFF,0,0,374,354,316,378}, 334 | {SHADER_TEXTURED,0xFF,0,0,353,355,371,373}, 335 | {SHADER_TEXTURED,0xFF,0,0,372,356,354,374}, 336 | {SHADER_TEXTURED,0xFF,0,0,355,357,365,371}, 337 | {SHADER_TEXTURED,0xFF,0,0,366,358,356,372}, 338 | {SHADER_TEXTURED,0xFF,0,0,357,359,363,365}, 339 | {SHADER_TEXTURED,0xFF,0,0,364,360,358,366}, 340 | {SHADER_TEXTURED,0xFF,0,0,289,291,363,359}, 341 | {SHADER_TEXTURED,0xFF,0,0,364,292,290,360}, 342 | {SHADER_TEXTURED,0xFF,0,0,73,359,357,301}, 343 | {SHADER_TEXTURED,0xFF,0,0,358,360,73,301}, 344 | {SHADER_TEXTURED,0xFF,0,0,283,285,287,289}, 345 | {SHADER_TEXTURED,0xFF,0,0,288,286,284,290}, 346 | {SHADER_TEXTURED,0xFF,0,0,283,289,359,73}, 347 | {SHADER_TEXTURED,0xFF,0,0,360,290,284,73}, 348 | {SHADER_TEXTURED,0xFF,0,0,72,283,73,73}, 349 | {SHADER_TEXTURED,0xFF,0,0,73,284,72,72}, 350 | {SHADER_TEXTURED,0xFF,0,0,293,295,309,361}, 351 | {SHADER_TEXTURED,0xFF,0,0,310,296,294,362}, 352 | {SHADER_TEXTURED,0xFF,0,0,309,311,367,361}, 353 | {SHADER_TEXTURED,0xFF,0,0,368,312,310,362}, 354 | {SHADER_TEXTURED,0xFF,0,0,311,381,369,367}, 355 | {SHADER_TEXTURED,0xFF,0,0,370,382,312,368}, 356 | {SHADER_TEXTURED,0xFF,0,0,313,375,369,381}, 357 | {SHADER_TEXTURED,0xFF,0,0,370,376,314,382}, 358 | {SHADER_TEXTURED,0xFF,0,0,347,349,385,383}, 359 | {SHADER_TEXTURED,0xFF,0,0,386,350,348,384}, 360 | {SHADER_TEXTURED,0xFF,0,0,317,383,385,319}, 361 | {SHADER_TEXTURED,0xFF,0,0,386,384,318,320}, 362 | {SHADER_TEXTURED,0xFF,0,0,297,299,383,317}, 363 | {SHADER_TEXTURED,0xFF,0,0,384,300,298,318}, 364 | {SHADER_TEXTURED,0xFF,0,0,299,343,341,383}, 365 | {SHADER_TEXTURED,0xFF,0,0,342,344,300,384}, 366 | {SHADER_TEXTURED,0xFF,0,0,341,347,383,383}, 367 | {SHADER_TEXTURED,0xFF,0,0,384,348,342,342}, 368 | {SHADER_TEXTURED,0xFF,0,0,299,345,343,343}, 369 | {SHADER_TEXTURED,0xFF,0,0,344,346,300,300}, 370 | {SHADER_TEXTURED,0xFF,0,0,313,321,379,377}, 371 | {SHADER_TEXTURED,0xFF,0,0,380,322,314,378}, 372 | {SHADER_TEXTURED,0xFF,0,0,315,377,379,323}, 373 | {SHADER_TEXTURED,0xFF,0,0,380,378,316,324}, 374 | {SHADER_TEXTURED,0xFF,0,0,319,385,379,321}, 375 | {SHADER_TEXTURED,0xFF,0,0,380,386,320,322}, 376 | {SHADER_TEXTURED,0xFF,0,0,349,351,379,385}, 377 | {SHADER_TEXTURED,0xFF,0,0,380,352,350,386}, 378 | {SHADER_TEXTURED,0xFF,0,0,323,379,351,351}, 379 | {SHADER_TEXTURED,0xFF,0,0,352,380,324,324}, 380 | {SHADER_TEXTURED,0xFF,0,0,399,387,413,401}, 381 | {SHADER_TEXTURED,0xFF,0,0,414,388,400,402}, 382 | {SHADER_TEXTURED,0xFF,0,0,399,401,403,397}, 383 | {SHADER_TEXTURED,0xFF,0,0,404,402,400,398}, 384 | {SHADER_TEXTURED,0xFF,0,0,397,403,405,395}, 385 | {SHADER_TEXTURED,0xFF,0,0,406,404,398,396}, 386 | {SHADER_TEXTURED,0xFF,0,0,395,405,407,393}, 387 | {SHADER_TEXTURED,0xFF,0,0,408,406,396,394}, 388 | {SHADER_TEXTURED,0xFF,0,0,393,407,409,391}, 389 | {SHADER_TEXTURED,0xFF,0,0,410,408,394,392}, 390 | {SHADER_TEXTURED,0xFF,0,0,391,409,411,389}, 391 | {SHADER_TEXTURED,0xFF,0,0,412,410,392,390}, 392 | {SHADER_TEXTURED,0xFF,0,0,409,419,417,411}, 393 | {SHADER_TEXTURED,0xFF,0,0,418,420,410,412}, 394 | {SHADER_TEXTURED,0xFF,0,0,407,421,419,409}, 395 | {SHADER_TEXTURED,0xFF,0,0,420,422,408,410}, 396 | {SHADER_TEXTURED,0xFF,0,0,405,423,421,407}, 397 | {SHADER_TEXTURED,0xFF,0,0,422,424,406,408}, 398 | {SHADER_TEXTURED,0xFF,0,0,403,425,423,405}, 399 | {SHADER_TEXTURED,0xFF,0,0,424,426,404,406}, 400 | {SHADER_TEXTURED,0xFF,0,0,401,427,425,403}, 401 | {SHADER_TEXTURED,0xFF,0,0,426,428,402,404}, 402 | {SHADER_TEXTURED,0xFF,0,0,401,413,415,427}, 403 | {SHADER_TEXTURED,0xFF,0,0,416,414,402,428}, 404 | {SHADER_TEXTURED,0xFF,0,0,317,319,443,441}, 405 | {SHADER_TEXTURED,0xFF,0,0,444,320,318,442}, 406 | {SHADER_TEXTURED,0xFF,0,0,319,389,411,443}, 407 | {SHADER_TEXTURED,0xFF,0,0,412,390,320,444}, 408 | {SHADER_TEXTURED,0xFF,0,0,309,317,441,311}, 409 | {SHADER_TEXTURED,0xFF,0,0,442,318,310,312}, 410 | {SHADER_TEXTURED,0xFF,0,0,381,429,413,387}, 411 | {SHADER_TEXTURED,0xFF,0,0,414,430,382,388}, 412 | {SHADER_TEXTURED,0xFF,0,0,411,417,439,443}, 413 | {SHADER_TEXTURED,0xFF,0,0,440,418,412,444}, 414 | {SHADER_TEXTURED,0xFF,0,0,437,445,443,439}, 415 | {SHADER_TEXTURED,0xFF,0,0,444,446,438,440}, 416 | {SHADER_TEXTURED,0xFF,0,0,433,445,437,435}, 417 | {SHADER_TEXTURED,0xFF,0,0,438,446,434,436}, 418 | {SHADER_TEXTURED,0xFF,0,0,431,447,445,433}, 419 | {SHADER_TEXTURED,0xFF,0,0,446,448,432,434}, 420 | {SHADER_TEXTURED,0xFF,0,0,429,447,431,449}, 421 | {SHADER_TEXTURED,0xFF,0,0,432,448,430,450}, 422 | {SHADER_TEXTURED,0xFF,0,0,413,429,449,415}, 423 | {SHADER_TEXTURED,0xFF,0,0,450,430,414,416}, 424 | {SHADER_TEXTURED,0xFF,0,0,311,447,429,381}, 425 | {SHADER_TEXTURED,0xFF,0,0,430,448,312,382}, 426 | {SHADER_TEXTURED,0xFF,0,0,311,441,445,447}, 427 | {SHADER_TEXTURED,0xFF,0,0,446,442,312,448}, 428 | {SHADER_TEXTURED,0xFF,0,0,441,443,445,445}, 429 | {SHADER_TEXTURED,0xFF,0,0,446,444,442,442}, 430 | {SHADER_TEXTURED,0xFF,0,0,415,449,451,475}, 431 | {SHADER_TEXTURED,0xFF,0,0,452,450,416,476}, 432 | {SHADER_TEXTURED,0xFF,0,0,449,431,461,451}, 433 | {SHADER_TEXTURED,0xFF,0,0,462,432,450,452}, 434 | {SHADER_TEXTURED,0xFF,0,0,431,433,459,461}, 435 | {SHADER_TEXTURED,0xFF,0,0,460,434,432,462}, 436 | {SHADER_TEXTURED,0xFF,0,0,433,435,457,459}, 437 | {SHADER_TEXTURED,0xFF,0,0,458,436,434,460}, 438 | {SHADER_TEXTURED,0xFF,0,0,435,437,455,457}, 439 | {SHADER_TEXTURED,0xFF,0,0,456,438,436,458}, 440 | {SHADER_TEXTURED,0xFF,0,0,437,439,453,455}, 441 | {SHADER_TEXTURED,0xFF,0,0,454,440,438,456}, 442 | {SHADER_TEXTURED,0xFF,0,0,439,417,473,453}, 443 | {SHADER_TEXTURED,0xFF,0,0,474,418,440,454}, 444 | {SHADER_TEXTURED,0xFF,0,0,427,415,475,463}, 445 | {SHADER_TEXTURED,0xFF,0,0,476,416,428,464}, 446 | {SHADER_TEXTURED,0xFF,0,0,425,427,463,465}, 447 | {SHADER_TEXTURED,0xFF,0,0,464,428,426,466}, 448 | {SHADER_TEXTURED,0xFF,0,0,423,425,465,467}, 449 | {SHADER_TEXTURED,0xFF,0,0,466,426,424,468}, 450 | {SHADER_TEXTURED,0xFF,0,0,421,423,467,469}, 451 | {SHADER_TEXTURED,0xFF,0,0,468,424,422,470}, 452 | {SHADER_TEXTURED,0xFF,0,0,419,421,469,471}, 453 | {SHADER_TEXTURED,0xFF,0,0,470,422,420,472}, 454 | {SHADER_TEXTURED,0xFF,0,0,417,419,471,473}, 455 | {SHADER_TEXTURED,0xFF,0,0,472,420,418,474}, 456 | {SHADER_TEXTURED,0xFF,0,0,457,455,479,477}, 457 | {SHADER_TEXTURED,0xFF,0,0,480,456,458,478}, 458 | {SHADER_TEXTURED,0xFF,0,0,477,479,481,483}, 459 | {SHADER_TEXTURED,0xFF,0,0,482,480,478,484}, 460 | {SHADER_TEXTURED,0xFF,0,0,483,481,487,485}, 461 | {SHADER_TEXTURED,0xFF,0,0,488,482,484,486}, 462 | {SHADER_TEXTURED,0xFF,0,0,485,487,489,491}, 463 | {SHADER_TEXTURED,0xFF,0,0,490,488,486,492}, 464 | {SHADER_TEXTURED,0xFF,0,0,463,475,485,491}, 465 | {SHADER_TEXTURED,0xFF,0,0,486,476,464,492}, 466 | {SHADER_TEXTURED,0xFF,0,0,451,483,485,475}, 467 | {SHADER_TEXTURED,0xFF,0,0,486,484,452,476}, 468 | {SHADER_TEXTURED,0xFF,0,0,451,461,477,483}, 469 | {SHADER_TEXTURED,0xFF,0,0,478,462,452,484}, 470 | {SHADER_TEXTURED,0xFF,0,0,457,477,461,459}, 471 | {SHADER_TEXTURED,0xFF,0,0,462,478,458,460}, 472 | {SHADER_TEXTURED,0xFF,0,0,453,473,479,455}, 473 | {SHADER_TEXTURED,0xFF,0,0,480,474,454,456}, 474 | {SHADER_TEXTURED,0xFF,0,0,471,481,479,473}, 475 | {SHADER_TEXTURED,0xFF,0,0,480,482,472,474}, 476 | {SHADER_TEXTURED,0xFF,0,0,469,487,481,471}, 477 | {SHADER_TEXTURED,0xFF,0,0,482,488,470,472}, 478 | {SHADER_TEXTURED,0xFF,0,0,467,489,487,469}, 479 | {SHADER_TEXTURED,0xFF,0,0,488,490,468,470}, 480 | {SHADER_TEXTURED,0xFF,0,0,465,491,489,467}, 481 | {SHADER_TEXTURED,0xFF,0,0,490,492,466,468}, 482 | {SHADER_TEXTURED,0xFF,0,0,463,491,465,465}, 483 | {SHADER_TEXTURED,0xFF,0,0,466,492,464,464}, 484 | {SHADER_TEXTURED,0xFF,0,0,391,389,503,501}, 485 | {SHADER_TEXTURED,0xFF,0,0,504,390,392,502}, 486 | {SHADER_TEXTURED,0xFF,0,0,393,391,501,499}, 487 | {SHADER_TEXTURED,0xFF,0,0,502,392,394,500}, 488 | {SHADER_TEXTURED,0xFF,0,0,395,393,499,497}, 489 | {SHADER_TEXTURED,0xFF,0,0,500,394,396,498}, 490 | {SHADER_TEXTURED,0xFF,0,0,397,395,497,495}, 491 | {SHADER_TEXTURED,0xFF,0,0,498,396,398,496}, 492 | {SHADER_TEXTURED,0xFF,0,0,399,397,495,493}, 493 | {SHADER_TEXTURED,0xFF,0,0,496,398,400,494}, 494 | {SHADER_TEXTURED,0xFF,0,0,387,399,493,505}, 495 | {SHADER_TEXTURED,0xFF,0,0,494,400,388,506}, 496 | {SHADER_TEXTURED,0xFF,0,0,493,501,503,505}, 497 | {SHADER_TEXTURED,0xFF,0,0,504,502,494,506}, 498 | {SHADER_TEXTURED,0xFF,0,0,493,495,499,501}, 499 | {SHADER_TEXTURED,0xFF,0,0,500,496,494,502}, 500 | {SHADER_TEXTURED,0xFF,0,0,495,497,499,499}, 501 | {SHADER_TEXTURED,0xFF,0,0,500,498,496,496}, 502 | {SHADER_TEXTURED,0xFF,0,0,313,381,387,505}, 503 | {SHADER_TEXTURED,0xFF,0,0,388,382,314,506}, 504 | {SHADER_TEXTURED,0xFF,0,0,313,505,503,321}, 505 | {SHADER_TEXTURED,0xFF,0,0,504,506,314,322}, 506 | {SHADER_TEXTURED,0xFF,0,0,319,321,503,389}, 507 | {SHADER_TEXTURED,0xFF,0,0,504,322,320,390} 508 | }; 509 | static qdVertex verts[507] = { 510 | {135,131,140}, 511 | {121,131,140}, 512 | {136,130,139}, 513 | {120,130,139}, 514 | {137,129,137}, 515 | {119,129,137}, 516 | {134,128,138}, 517 | {122,128,138}, 518 | {134,129,140}, 519 | {122,129,140}, 520 | {134,130,141}, 521 | {122,130,141}, 522 | {132,131,141}, 523 | {124,131,141}, 524 | {131,130,140}, 525 | {125,130,140}, 526 | {131,129,138}, 527 | {126,129,138}, 528 | {129,132,139}, 529 | {127,132,139}, 530 | {130,132,140}, 531 | {126,132,140}, 532 | {132,132,141}, 533 | {124,132,141}, 534 | {132,133,141}, 535 | {124,133,141}, 536 | {131,134,140}, 537 | {125,134,140}, 538 | {131,135,138}, 539 | {126,135,138}, 540 | {134,136,138}, 541 | {122,136,138}, 542 | {134,135,140}, 543 | {122,135,140}, 544 | {134,134,141}, 545 | {122,134,141}, 546 | {135,133,140}, 547 | {121,133,140}, 548 | {136,134,139}, 549 | {120,134,139}, 550 | {137,135,137}, 551 | {119,135,137}, 552 | {138,132,137}, 553 | {118,132,137}, 554 | {137,132,139}, 555 | {119,132,139}, 556 | {136,132,140}, 557 | {121,132,140}, 558 | {136,132,140}, 559 | {120,132,140}, 560 | {135,133,141}, 561 | {121,133,141}, 562 | {134,134,141}, 563 | {122,134,141}, 564 | {132,133,141}, 565 | {124,133,141}, 566 | {132,132,141}, 567 | {124,132,141}, 568 | {132,131,141}, 569 | {124,131,141}, 570 | {134,132,141}, 571 | {122,132,141}, 572 | {134,130,141}, 573 | {122,130,141}, 574 | {135,131,141}, 575 | {121,131,141}, 576 | {128,135,140}, 577 | {128,134,141}, 578 | {128,117,140}, 579 | {128,123,141}, 580 | {128,125,141}, 581 | {128,116,140}, 582 | {128,135,138}, 583 | {128,137,137}, 584 | {128,142,119}, 585 | {128,137,114}, 586 | {128,129,115}, 587 | {128,122,122}, 588 | {131,125,137}, 589 | {125,125,137}, 590 | {133,121,137}, 591 | {123,121,137}, 592 | {134,117,137}, 593 | {122,117,137}, 594 | {134,114,137}, 595 | {122,114,137}, 596 | {133,113,136}, 597 | {123,113,136}, 598 | {131,113,137}, 599 | {125,113,137}, 600 | {128,112,137}, 601 | {135,126,137}, 602 | {121,126,137}, 603 | {138,127,137}, 604 | {118,127,137}, 605 | {141,130,135}, 606 | {115,130,135}, 607 | {142,135,138}, 608 | {114,135,138}, 609 | {139,136,138}, 610 | {117,136,138}, 611 | {136,138,139}, 612 | {120,138,139}, 613 | {133,140,140}, 614 | {123,140,140}, 615 | {131,140,140}, 616 | {126,140,140}, 617 | {129,136,140}, 618 | {127,136,140}, 619 | {131,135,140}, 620 | {125,135,140}, 621 | {130,133,140}, 622 | {126,133,140}, 623 | {131,130,140}, 624 | {125,130,140}, 625 | {134,128,139}, 626 | {122,128,139}, 627 | {136,129,139}, 628 | {120,129,139}, 629 | {138,131,138}, 630 | {118,131,138}, 631 | {138,133,138}, 632 | {118,133,138}, 633 | {138,134,139}, 634 | {118,134,139}, 635 | {135,135,140}, 636 | {121,135,140}, 637 | {132,136,140}, 638 | {124,136,140}, 639 | {128,116,140}, 640 | {130,117,140}, 641 | {126,117,140}, 642 | {130,115,139}, 643 | {126,115,139}, 644 | {129,114,139}, 645 | {127,114,139}, 646 | {128,114,139}, 647 | {128,125,140}, 648 | {128,126,140}, 649 | {130,126,140}, 650 | {126,126,140}, 651 | {130,124,140}, 652 | {126,124,140}, 653 | {129,123,140}, 654 | {127,123,140}, 655 | {134,127,139}, 656 | {122,127,139}, 657 | {138,129,138}, 658 | {118,129,138}, 659 | {140,131,138}, 660 | {116,131,138}, 661 | {140,134,139}, 662 | {116,134,139}, 663 | {139,135,140}, 664 | {117,135,140}, 665 | {135,137,141}, 666 | {121,137,141}, 667 | {133,138,141}, 668 | {123,138,141}, 669 | {131,138,142}, 670 | {125,138,142}, 671 | {130,135,142}, 672 | {126,135,142}, 673 | {130,126,141}, 674 | {126,126,141}, 675 | {131,121,139}, 676 | {125,121,139}, 677 | {132,117,139}, 678 | {124,117,139}, 679 | {132,115,139}, 680 | {124,115,139}, 681 | {132,113,138}, 682 | {124,113,138}, 683 | {131,113,138}, 684 | {125,113,138}, 685 | {128,113,138}, 686 | {128,129,140}, 687 | {128,131,140}, 688 | {133,136,140}, 689 | {123,136,140}, 690 | {131,130,140}, 691 | {125,130,140}, 692 | {130,131,140}, 693 | {126,131,140}, 694 | {130,117,140}, 695 | {126,117,140}, 696 | {129,121,140}, 697 | {127,121,140}, 698 | {128,121,140}, 699 | {128,123,140}, 700 | {130,124,141}, 701 | {127,124,141}, 702 | {130,124,141}, 703 | {126,124,141}, 704 | {130,126,141}, 705 | {126,126,141}, 706 | {129,126,141}, 707 | {127,126,141}, 708 | {128,125,141}, 709 | {129,126,141}, 710 | {127,126,141}, 711 | {130,126,141}, 712 | {127,126,141}, 713 | {130,124,141}, 714 | {126,124,141}, 715 | {129,124,141}, 716 | {127,124,141}, 717 | {128,123,141}, 718 | {132,123,137}, 719 | {124,123,137}, 720 | {131,124,139}, 721 | {125,124,139}, 722 | {131,123,139}, 723 | {125,123,139}, 724 | {132,124,137}, 725 | {124,124,137}, 726 | {128,114,139}, 727 | {129,114,139}, 728 | {127,114,139}, 729 | {130,115,139}, 730 | {127,115,139}, 731 | {130,116,140}, 732 | {127,116,140}, 733 | {128,116,139}, 734 | {130,116,139}, 735 | {127,116,139}, 736 | {130,115,138}, 737 | {127,115,138}, 738 | {129,114,138}, 739 | {127,114,138}, 740 | {128,114,138}, 741 | {131,132,141}, 742 | {125,132,141}, 743 | {131,131,140}, 744 | {125,131,140}, 745 | {133,135,140}, 746 | {123,135,140}, 747 | {132,135,140}, 748 | {124,135,140}, 749 | {135,134,140}, 750 | {121,134,140}, 751 | {137,134,139}, 752 | {119,134,139}, 753 | {137,133,139}, 754 | {119,133,139}, 755 | {137,131,139}, 756 | {119,131,139}, 757 | {136,130,140}, 758 | {120,130,140}, 759 | {134,129,140}, 760 | {122,129,140}, 761 | {132,130,141}, 762 | {124,130,141}, 763 | {131,133,141}, 764 | {125,133,141}, 765 | {131,134,141}, 766 | {125,134,141}, 767 | {132,134,140}, 768 | {124,134,140}, 769 | {131,133,140}, 770 | {125,133,140}, 771 | {132,130,140}, 772 | {124,130,140}, 773 | {134,129,140}, 774 | {122,129,140}, 775 | {135,130,139}, 776 | {121,130,139}, 777 | {137,131,139}, 778 | {119,131,139}, 779 | {137,133,139}, 780 | {119,133,139}, 781 | {137,133,139}, 782 | {120,133,139}, 783 | {135,134,140}, 784 | {121,134,140}, 785 | {133,134,140}, 786 | {124,134,140}, 787 | {133,135,140}, 788 | {123,135,140}, 789 | {131,131,140}, 790 | {125,131,140}, 791 | {131,132,140}, 792 | {125,132,140}, 793 | {130,135,138}, 794 | {126,135,138}, 795 | {131,139,138}, 796 | {125,139,138}, 797 | {133,139,138}, 798 | {123,139,138}, 799 | {136,137,137}, 800 | {120,137,137}, 801 | {139,135,136}, 802 | {117,135,136}, 803 | {141,135,135}, 804 | {115,135,135}, 805 | {140,131,134}, 806 | {116,131,134}, 807 | {138,128,135}, 808 | {118,128,135}, 809 | {135,127,136}, 810 | {121,127,136}, 811 | {128,142,133}, 812 | {128,144,127}, 813 | {128,125,117}, 814 | {128,121,131}, 815 | {128,112,135}, 816 | {128,115,134}, 817 | {128,119,133}, 818 | {128,120,133}, 819 | {142,132,129}, 820 | {114,132,129}, 821 | {142,133,127}, 822 | {114,133,127}, 823 | {140,132,121}, 824 | {116,132,121}, 825 | {135,135,117}, 826 | {121,135,117}, 827 | {140,127,129}, 828 | {116,127,129}, 829 | {138,126,125}, 830 | {119,126,125}, 831 | {138,128,121}, 832 | {118,128,121}, 833 | {133,129,117}, 834 | {123,129,117}, 835 | {132,122,135}, 836 | {124,122,135}, 837 | {131,121,132}, 838 | {125,121,132}, 839 | {133,117,134}, 840 | {123,117,134}, 841 | {132,120,134}, 842 | {124,120,134}, 843 | {133,113,134}, 844 | {123,113,134}, 845 | {130,116,134}, 846 | {126,116,134}, 847 | {130,119,134}, 848 | {126,119,134}, 849 | {131,113,135}, 850 | {125,113,135}, 851 | {132,124,135}, 852 | {125,124,135}, 853 | {131,124,136}, 854 | {125,124,136}, 855 | {131,125,136}, 856 | {125,125,136}, 857 | {131,122,131}, 858 | {125,122,131}, 859 | {133,123,124}, 860 | {123,123,124}, 861 | {134,126,119}, 862 | {123,126,119}, 863 | {135,142,122}, 864 | {121,142,122}, 865 | {135,143,127}, 866 | {121,143,127}, 867 | {135,142,132}, 868 | {121,142,132}, 869 | {135,136,135}, 870 | {121,136,135}, 871 | {140,135,133}, 872 | {116,135,133}, 873 | {138,135,133}, 874 | {118,135,133}, 875 | {138,139,129}, 876 | {118,139,129}, 877 | {141,137,130}, 878 | {115,137,130}, 879 | {141,138,126}, 880 | {115,138,126}, 881 | {138,140,125}, 882 | {118,140,125}, 883 | {138,139,121}, 884 | {118,139,121}, 885 | {141,137,122}, 886 | {115,137,122}, 887 | {138,133,119}, 888 | {118,133,119}, 889 | {136,128,119}, 890 | {120,128,119}, 891 | {141,133,125}, 892 | {115,133,125}, 893 | {135,125,130}, 894 | {122,125,130}, 895 | {135,125,125}, 896 | {121,125,125}, 897 | {142,135,124}, 898 | {114,135,124}, 899 | {140,126,126}, 900 | {116,126,126}, 901 | {145,126,123}, 902 | {111,126,123}, 903 | {149,129,121}, 904 | {108,129,121}, 905 | {150,133,121}, 906 | {106,133,121}, 907 | {148,136,121}, 908 | {108,136,121}, 909 | {144,136,123}, 910 | {112,136,123}, 911 | {144,135,123}, 912 | {112,135,123}, 913 | {147,135,122}, 914 | {109,135,122}, 915 | {148,133,122}, 916 | {108,133,122}, 917 | {147,129,122}, 918 | {109,129,122}, 919 | {145,127,123}, 920 | {112,127,123}, 921 | {141,127,126}, 922 | {115,127,126}, 923 | {143,134,125}, 924 | {113,134,125}, 925 | {143,133,123}, 926 | {113,133,123}, 927 | {142,128,125}, 928 | {114,128,125}, 929 | {145,128,122}, 930 | {111,128,122}, 931 | {147,130,121}, 932 | {109,130,121}, 933 | {148,132,121}, 934 | {108,132,121}, 935 | {147,134,121}, 936 | {109,134,121}, 937 | {144,134,122}, 938 | {112,134,122}, 939 | {142,133,125}, 940 | {115,133,125}, 941 | {141,131,124}, 942 | {115,131,124}, 943 | {140,130,124}, 944 | {116,130,124}, 945 | {141,129,124}, 946 | {115,129,124}, 947 | {142,128,124}, 948 | {115,128,124}, 949 | {141,128,124}, 950 | {115,128,124}, 951 | {140,128,127}, 952 | {116,128,127}, 953 | {140,128,125}, 954 | {117,128,125}, 955 | {140,129,125}, 956 | {117,129,125}, 957 | {141,131,125}, 958 | {115,131,125}, 959 | {142,132,124}, 960 | {114,132,124}, 961 | {142,132,123}, 962 | {114,132,123}, 963 | {141,128,123}, 964 | {115,128,123}, 965 | {142,128,123}, 966 | {114,128,123}, 967 | {141,129,123}, 968 | {115,129,123}, 969 | {140,130,123}, 970 | {116,130,123}, 971 | {142,131,123}, 972 | {115,131,123}, 973 | {145,133,121}, 974 | {111,133,121}, 975 | {147,134,120}, 976 | {109,134,120}, 977 | {148,132,120}, 978 | {108,132,120}, 979 | {147,129,120}, 980 | {109,129,120}, 981 | {145,128,121}, 982 | {111,128,121}, 983 | {142,128,124}, 984 | {114,128,124}, 985 | {143,133,123}, 986 | {113,133,123}, 987 | {142,130,123}, 988 | {114,130,123}, 989 | {143,129,123}, 990 | {113,129,123}, 991 | {144,130,122}, 992 | {112,130,122}, 993 | {143,131,122}, 994 | {113,131,122}, 995 | {144,132,122}, 996 | {112,132,122}, 997 | {145,131,122}, 998 | {111,131,122}, 999 | {146,131,122}, 1000 | {110,131,122}, 1001 | {145,132,122}, 1002 | {111,132,122}, 1003 | {144,135,120}, 1004 | {112,135,120}, 1005 | {148,136,119}, 1006 | {108,136,119}, 1007 | {150,133,120}, 1008 | {106,133,120}, 1009 | {149,129,120}, 1010 | {107,129,120}, 1011 | {145,127,120}, 1012 | {111,127,120}, 1013 | {141,126,123}, 1014 | {115,126,123}, 1015 | {142,134,122}, 1016 | {114,134,122} 1017 | }; 1018 | -------------------------------------------------------------------------------- /src/quad/canvas.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _qdBlitCanvas 4 | public _qdClearCanvas 5 | 6 | public canvas 7 | public canvas_width 8 | public canvas_height 9 | public canvas_offset 10 | 11 | canvas:=$D40000 12 | canvas_width:=160 13 | canvas_height:=120 14 | canvas_offset:=48 15 | 16 | gfxFillScreenFastCode:=$E30800 17 | 18 | ;coopts gfx_FillScreen fast code @ e30800 19 | _qdClearCanvas: 20 | ld iy,0 21 | add iy,sp 22 | ld hl,canvas + 345*89 23 | ld sp,hl 24 | or a,a 25 | sbc hl,hl 26 | ex de,hl 27 | ld b,89 28 | call gfxFillScreenFastCode 29 | ld sp,iy 30 | ret 31 | 32 | _qdBlitCanvas: 33 | ld hl,canvas+canvas_offset 34 | ld bc,0 35 | exx 36 | pop de 37 | pop hl 38 | push hl 39 | push de 40 | ld de,320 41 | ld b,canvas_height 42 | .loop: 43 | push hl 44 | add hl,de 45 | exx 46 | pop de 47 | ld c,canvas_width 48 | ldir 49 | inc h 50 | ld l,canvas_offset 51 | exx 52 | djnz .loop 53 | ret -------------------------------------------------------------------------------- /src/quad/def3d.h: -------------------------------------------------------------------------------- 1 | #ifndef DEF3D 2 | #define DEF3D 3 | 4 | // type defines 5 | 6 | typedef enum { 7 | SHADER_TEXTURED = 0, 8 | SHADER_FLAT, 9 | SHADER_TRANS 10 | } SHADER_TYPE; 11 | 12 | // 3 bytes 13 | // object centers measured from <128,128,128> 14 | typedef struct { 15 | uint8_t x; 16 | uint8_t y; 17 | uint8_t z; 18 | } qdVertex; 19 | 20 | // 12 bytes 21 | typedef struct { 22 | uint8_t shader; // shader type 23 | uint8_t light; // light level + palette 24 | uint8_t u,v; // UV coords 25 | uint16_t vt0,vt1,vt2,vt3; // vertices of face 26 | } qdFace; 27 | 28 | // 18 bytes 29 | typedef struct { 30 | int16_t x; 31 | int16_t y; 32 | int16_t z; 33 | uint16_t numVerts; 34 | uint16_t numFaces; 35 | qdVertex* vertex; 36 | qdFace* face; 37 | uint8_t uOffset; // UV offset from 0,0 38 | uint8_t vOffset; 39 | } qdObject; 40 | 41 | 42 | #define spriteSize(n) (n>>1) 43 | // 19 bytes 44 | typedef struct { 45 | int16_t x,y,z; // world position 46 | uint8_t u,v; // texture uv 47 | uint8_t hw,hh; // half width/height. 48 | uint8_t depth; // screen position and depth. Set by render function for possible usage. 49 | int16_t xs,xe; 50 | int16_t ys,ye; 51 | } qdSprite; 52 | 53 | 54 | // 20 bytes 55 | // generated by render functions for later use. 56 | struct qd_face_cached { 57 | uint8_t shader; 58 | uint8_t light; 59 | uint8_t u0,v0; 60 | int8_t x0,y0; 61 | int16_t ay,ax,by,bx,cy,cx; 62 | uint16_t next; 63 | }; 64 | 65 | #endif 66 | -------------------------------------------------------------------------------- /src/quad/euler.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _qdEulerToMatrix 4 | 5 | extern mulAngle 6 | extern _fixedSin 7 | extern __frameset 8 | 9 | matrix equ ix+6 10 | ax equ ix+9 11 | ay equ ix+12 12 | az equ ix+15 13 | 14 | s1 equ ix-3 15 | c1 equ ix-6 16 | s2 equ ix-9 17 | c2 equ ix-12 18 | s3 equ ix-15 19 | c3 equ ix-18 20 | 21 | m00 equ iy+0 22 | m01 equ iy+2 23 | m02 equ iy+4 24 | m10 equ iy+6 25 | m11 equ iy+8 26 | m12 equ iy+10 27 | m20 equ iy+12 28 | m21 equ iy+14 29 | m22 equ iy+16 30 | x equ iy+18 31 | y equ iy+20 32 | z equ iy+22 33 | 34 | 35 | _qdEulerToMatrix: 36 | ld hl,-18 37 | call __frameset 38 | ld iy,(matrix) 39 | 40 | ld hl,(ay) 41 | call _fixedSin 42 | ld (s1),hl 43 | ld hl,(ay) 44 | ld de,256 45 | add hl,de 46 | call _fixedSin 47 | ld (c1),hl 48 | 49 | ld hl,(ax) 50 | call _fixedSin 51 | ld (s2),hl 52 | ld (m21),hl 53 | ld hl,(ax) 54 | ld de,256 55 | add hl,de 56 | call _fixedSin 57 | ld (c2),hl 58 | 59 | ld hl,(az) 60 | call _fixedSin 61 | ld (s3),hl 62 | ld hl,(az) 63 | ld de,256 64 | add hl,de 65 | call _fixedSin 66 | ld (c3),hl 67 | 68 | ld bc,(c1) 69 | call mulAngle 70 | push hl 71 | ld hl,(s1) 72 | ld bc,(s2) 73 | call mulAngle 74 | ld bc,(s3) 75 | call mulAngle 76 | ex de,hl 77 | pop hl 78 | or a,a 79 | sbc hl,de 80 | ld (m00),hl 81 | 82 | ld hl,(c2) 83 | ld bc,(s3) 84 | call mulAngle 85 | ex de,hl 86 | or a,a 87 | sbc hl,hl 88 | sbc hl,de 89 | ld (m01),hl 90 | 91 | ld hl,(s1) 92 | ld bc,(c3) 93 | call mulAngle 94 | push hl 95 | ld hl,(c1) 96 | ld bc,(s2) 97 | call mulAngle 98 | ld bc,(s3) 99 | call mulAngle 100 | pop de 101 | add hl,de 102 | ld (m02),hl 103 | 104 | ld hl,(s3) 105 | ld bc,(c1) 106 | call mulAngle 107 | push hl 108 | ld hl,(c3) 109 | ld bc,(s2) 110 | call mulAngle 111 | ld bc,(s1) 112 | call mulAngle 113 | pop de 114 | add hl,de 115 | ld (m10),hl 116 | 117 | ld hl,(c2) 118 | ld bc,(c3) 119 | call mulAngle 120 | ld (m11),hl 121 | 122 | ld hl,(s1) 123 | ld bc,(s3) 124 | call mulAngle 125 | push hl 126 | ld hl,(c1) 127 | ld bc,(s2) 128 | call mulAngle 129 | ld bc,(c3) 130 | call mulAngle 131 | ex de,hl 132 | pop hl 133 | or a,a 134 | sbc hl,de 135 | ld (m12),hl 136 | 137 | ld hl,(c2) 138 | ld bc,(s1) 139 | call mulAngle 140 | ex de,hl 141 | or a,a 142 | sbc hl,hl 143 | sbc hl,de 144 | ld (m20),l 145 | ld (m20+1),h 146 | 147 | ld hl,(c2) 148 | ld bc,(c1) 149 | call mulAngle 150 | ld (m22),l 151 | ld (m22+1),h 152 | 153 | ld sp,ix 154 | pop ix 155 | ret 156 | -------------------------------------------------------------------------------- /src/quad/fxmath.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _sqrtInt 4 | public _fxMul 5 | public _fxDiv 6 | public _fxSin 7 | ; for Assembly usage 8 | 9 | public _MultiplyHLBC 10 | public _DivideHLBC 11 | public _sqrtHL 12 | 13 | public _fixedHLmulBC 14 | public _fixedHLdivBC 15 | public _fixedSin 16 | 17 | public mulAngle 18 | 19 | extern _fixedSinTable 20 | 21 | 22 | ;------------------------------------------------ 23 | _MultiplyHLBC: 24 | ; Performs (un)signed integer multiplication 25 | ; Inputs: 26 | ; HL : Operand 1 27 | ; BC : Operand 2 28 | ; Outputs: 29 | ; HL = HL*BC 30 | push iy 31 | push hl 32 | push bc 33 | push hl 34 | ld iy,0 35 | ld d,l 36 | ld e,b 37 | mlt de 38 | add iy,de 39 | ld d,c 40 | ld e,h 41 | mlt de 42 | add iy,de 43 | ld d,c 44 | ld e,l 45 | mlt de 46 | ld c,h 47 | mlt bc 48 | ld a,c 49 | inc sp 50 | inc sp 51 | pop hl 52 | mlt hl 53 | add a,l 54 | pop hl 55 | inc sp 56 | mlt hl 57 | add a,l 58 | ld b,a 59 | ld c,0 60 | lea hl,iy+0 61 | add hl,bc 62 | add hl,hl 63 | add hl,hl 64 | add hl,hl 65 | add hl,hl 66 | add hl,hl 67 | add hl,hl 68 | add hl,hl 69 | add hl,hl 70 | add hl,de 71 | pop iy 72 | ret 73 | 74 | ;------------------------------------------------ 75 | ; signed fixed point division of HL by BC 76 | _fxDiv: 77 | pop de 78 | pop hl 79 | pop bc 80 | push bc 81 | push hl 82 | push de 83 | _fixedHLdivBC: 84 | add hl,hl 85 | add hl,hl 86 | add hl,hl 87 | add hl,hl 88 | add hl,hl 89 | add hl,hl 90 | add hl,hl 91 | add hl,hl ; fallthrough to normal division routine 92 | 93 | ;------------------------------------------------ 94 | _DivideHLBC: 95 | ; Performs signed integer division 96 | ; Inputs: 97 | ; HL : Operand 1 98 | ; BC : Operand 2 99 | ; Outputs: 100 | ; HL = HL/BC 101 | ex de,hl 102 | xor a,a 103 | sbc hl,hl 104 | sbc hl,bc 105 | jp p,.next0 106 | push hl 107 | pop bc 108 | inc a 109 | .next0: 110 | or a,a 111 | sbc hl,hl 112 | sbc hl,de 113 | jp m,.next1 114 | ex de,hl 115 | inc a 116 | .next1: 117 | add hl,de 118 | rra 119 | 120 | repeat 24 121 | ex de,hl 122 | adc hl,hl 123 | ex de,hl 124 | adc hl,hl 125 | add hl,bc 126 | jr c,$+4 127 | sbc hl,bc 128 | end repeat 129 | 130 | ex de,hl 131 | adc hl,hl 132 | ret c 133 | ex de,hl 134 | sbc hl,hl 135 | sbc hl,de 136 | ret 137 | 138 | 139 | ;------------------------------------------------ 140 | ;https://www.cemetech.net/forum/viewtopic.php?p=253204 141 | ; uhl = sqrt(uhl) 142 | _sqrtInt: 143 | pop bc 144 | pop hl 145 | push hl 146 | push bc 147 | _sqrtHL: 148 | dec sp ; (sp) = ? 149 | push hl ; (sp) = ?uhl 150 | dec sp ; (sp) = ?uhl? 151 | pop iy ; (sp) = ?u, uiy = hl? 152 | dec sp ; (sp) = ?u? 153 | pop af ; af = u? 154 | or a,a 155 | sbc hl,hl 156 | ex de,hl ; de = 0 157 | sbc hl,hl ; hl = 0 158 | ld bc,0C40h ; b = 12, c = 0x40 159 | Sqrt24Loop: 160 | sub a,c 161 | sbc hl,de 162 | jr nc,Sqrt24Skip 163 | add a,c 164 | adc hl,de 165 | Sqrt24Skip: 166 | ccf 167 | rl e 168 | rl d 169 | add iy,iy 170 | rla 171 | adc hl,hl 172 | add iy,iy 173 | rla 174 | adc hl,hl 175 | djnz Sqrt24Loop 176 | ex de,hl 177 | ret 178 | 179 | 180 | ;------------------------------------------------ 181 | ;Multiplies two signed 8.8 fixed point numbers HL & BC 182 | _fxMul: 183 | pop de 184 | pop hl 185 | pop bc 186 | push bc 187 | push hl 188 | push de 189 | _fixedHLmulBC: 190 | ex de,hl 191 | ld h,d 192 | ld l,b 193 | mlt hl 194 | ld a,l 195 | bit 7,d 196 | jr Z,$+3 197 | sub a,c 198 | bit 7,b 199 | jr Z,$+3 200 | sub a,e 201 | ld h,e 202 | ld l,c 203 | mlt hl 204 | ld l,h 205 | ld h,a 206 | ld a,b 207 | ld b,d 208 | ld d,a 209 | mlt de 210 | mlt bc 211 | add hl,de 212 | add hl,bc 213 | ret 214 | 215 | ;------------------------------------------------ 216 | ; returns 4.12 fixed point sine of hl(range 0..1023) 217 | _fxSin: 218 | pop bc 219 | pop hl 220 | push hl 221 | push bc 222 | _fixedSin: 223 | ld a,h 224 | and a,00000011b 225 | ld h,a 226 | bit 1,h 227 | jr nz,.negative 228 | bit 0,h 229 | jr z,.nosymmetry 230 | ex de,hl 231 | ld hl,512 232 | or a,a 233 | sbc.sis hl,de 234 | .nosymmetry: 235 | ex.sis de,hl 236 | ld hl,_fixedSinTable 237 | add hl,de 238 | add hl,de 239 | ld hl,(hl) 240 | ret 241 | .negative: 242 | res 1,h 243 | call _fixedSin 244 | ex de,hl 245 | or a,a 246 | sbc hl,hl 247 | sbc hl,de 248 | ret 249 | 250 | ; 4.12 fixed multiply hl*bc 251 | mulAngle: 252 | ex de,hl 253 | ld l,e 254 | ld h,c 255 | mlt hl 256 | ld a,h 257 | 258 | ld h,d 259 | ld l,b 260 | mlt hl 261 | bit 7,b 262 | jr z,$+6 263 | or a,a 264 | sbc.sis hl,de 265 | bit 7,d 266 | jr z,$+6 267 | or a,a 268 | sbc.sis hl,bc 269 | 270 | repeat 8 271 | add hl,hl 272 | end repeat 273 | ld l,a 274 | 275 | ld a,d 276 | ld d,b 277 | ld b,a 278 | mlt de 279 | mlt bc 280 | add hl,de 281 | add hl,bc 282 | 283 | repeat 4 284 | add hl,hl 285 | end repeat 286 | 287 | dec sp 288 | push hl 289 | inc sp 290 | pop hl 291 | 292 | ret 293 | -------------------------------------------------------------------------------- /src/quad/fxmath.h: -------------------------------------------------------------------------------- 1 | #ifndef FXMATH 2 | #define FXMATH 3 | 4 | //https://www.cemetech.net/forum/viewtopic.php?p=253204 5 | int sqrtInt(int x); 6 | 7 | // fixed 8.8 -> 8.8 operations 8 | int fxMul(int x,int y); 9 | 10 | int fxDiv(int num,int dem); 11 | 12 | // angle in 360 degrees/1024 (1.40625) 13 | int fxSin(uint16_t angle); 14 | 15 | #define fxCos(a) fxSin(a+256) 16 | 17 | 18 | #endif -------------------------------------------------------------------------------- /src/quad/lut.asm: -------------------------------------------------------------------------------- 1 | section .rodata 2 | 3 | public _fixedSinTable 4 | public _ZinvLUT 5 | public _invLUT 6 | 7 | _fixedSinTable: 8 | dw 0 9 | dw 25 10 | dw 50 11 | dw 75 12 | dw 100 13 | dw 125 14 | dw 150 15 | dw 175 16 | dw 200 17 | dw 226 18 | dw 251 19 | dw 276 20 | dw 301 21 | dw 326 22 | dw 351 23 | dw 376 24 | dw 401 25 | dw 426 26 | dw 451 27 | dw 476 28 | dw 501 29 | dw 526 30 | dw 551 31 | dw 576 32 | dw 601 33 | dw 625 34 | dw 650 35 | dw 675 36 | dw 700 37 | dw 725 38 | dw 749 39 | dw 774 40 | dw 799 41 | dw 823 42 | dw 848 43 | dw 872 44 | dw 897 45 | dw 921 46 | dw 946 47 | dw 970 48 | dw 995 49 | dw 1019 50 | dw 1043 51 | dw 1068 52 | dw 1092 53 | dw 1116 54 | dw 1140 55 | dw 1164 56 | dw 1189 57 | dw 1213 58 | dw 1237 59 | dw 1260 60 | dw 1284 61 | dw 1308 62 | dw 1332 63 | dw 1356 64 | dw 1379 65 | dw 1403 66 | dw 1427 67 | dw 1450 68 | dw 1474 69 | dw 1497 70 | dw 1520 71 | dw 1544 72 | dw 1567 73 | dw 1590 74 | dw 1613 75 | dw 1636 76 | dw 1659 77 | dw 1682 78 | dw 1705 79 | dw 1728 80 | dw 1751 81 | dw 1773 82 | dw 1796 83 | dw 1819 84 | dw 1841 85 | dw 1864 86 | dw 1886 87 | dw 1908 88 | dw 1930 89 | dw 1952 90 | dw 1975 91 | dw 1997 92 | dw 2018 93 | dw 2040 94 | dw 2062 95 | dw 2084 96 | dw 2105 97 | dw 2127 98 | dw 2148 99 | dw 2170 100 | dw 2191 101 | dw 2212 102 | dw 2233 103 | dw 2254 104 | dw 2275 105 | dw 2296 106 | dw 2317 107 | dw 2337 108 | dw 2358 109 | dw 2379 110 | dw 2399 111 | dw 2419 112 | dw 2439 113 | dw 2460 114 | dw 2480 115 | dw 2500 116 | dw 2519 117 | dw 2539 118 | dw 2559 119 | dw 2578 120 | dw 2598 121 | dw 2617 122 | dw 2637 123 | dw 2656 124 | dw 2675 125 | dw 2694 126 | dw 2713 127 | dw 2732 128 | dw 2750 129 | dw 2769 130 | dw 2787 131 | dw 2806 132 | dw 2824 133 | dw 2842 134 | dw 2860 135 | dw 2878 136 | dw 2896 137 | dw 2914 138 | dw 2931 139 | dw 2949 140 | dw 2966 141 | dw 2983 142 | dw 3000 143 | dw 3018 144 | dw 3034 145 | dw 3051 146 | dw 3068 147 | dw 3085 148 | dw 3101 149 | dw 3117 150 | dw 3134 151 | dw 3150 152 | dw 3166 153 | dw 3182 154 | dw 3197 155 | dw 3213 156 | dw 3229 157 | dw 3244 158 | dw 3259 159 | dw 3274 160 | dw 3289 161 | dw 3304 162 | dw 3319 163 | dw 3334 164 | dw 3348 165 | dw 3363 166 | dw 3377 167 | dw 3391 168 | dw 3405 169 | dw 3419 170 | dw 3433 171 | dw 3447 172 | dw 3460 173 | dw 3473 174 | dw 3487 175 | dw 3500 176 | dw 3513 177 | dw 3526 178 | dw 3538 179 | dw 3551 180 | dw 3563 181 | dw 3576 182 | dw 3588 183 | dw 3600 184 | dw 3612 185 | dw 3624 186 | dw 3635 187 | dw 3647 188 | dw 3658 189 | dw 3669 190 | dw 3680 191 | dw 3691 192 | dw 3702 193 | dw 3713 194 | dw 3723 195 | dw 3734 196 | dw 3744 197 | dw 3754 198 | dw 3764 199 | dw 3774 200 | dw 3784 201 | dw 3793 202 | dw 3803 203 | dw 3812 204 | dw 3821 205 | dw 3830 206 | dw 3839 207 | dw 3848 208 | dw 3856 209 | dw 3864 210 | dw 3873 211 | dw 3881 212 | dw 3889 213 | dw 3897 214 | dw 3904 215 | dw 3912 216 | dw 3919 217 | dw 3926 218 | dw 3933 219 | dw 3940 220 | dw 3947 221 | dw 3954 222 | dw 3960 223 | dw 3967 224 | dw 3973 225 | dw 3979 226 | dw 3985 227 | dw 3990 228 | dw 3996 229 | dw 4001 230 | dw 4007 231 | dw 4012 232 | dw 4017 233 | dw 4022 234 | dw 4026 235 | dw 4031 236 | dw 4035 237 | dw 4039 238 | dw 4043 239 | dw 4047 240 | dw 4051 241 | dw 4055 242 | dw 4058 243 | dw 4062 244 | dw 4065 245 | dw 4068 246 | dw 4071 247 | dw 4073 248 | dw 4076 249 | dw 4078 250 | dw 4080 251 | dw 4082 252 | dw 4084 253 | dw 4086 254 | dw 4088 255 | dw 4089 256 | dw 4091 257 | dw 4092 258 | dw 4093 259 | dw 4094 260 | dw 4094 261 | dw 4095 262 | dw 4095 263 | dw 4095 264 | dw 4096 265 | 266 | _ZinvLUT: 267 | dw 49443 268 | dw 24721 269 | dw 16481 270 | dw 12360 271 | dw 9888 272 | dw 8240 273 | dw 7063 274 | dw 6180 275 | dw 5493 276 | dw 4944 277 | dw 4494 278 | dw 4120 279 | dw 3803 280 | dw 3531 281 | dw 3296 282 | dw 3090 283 | dw 2908 284 | dw 2746 285 | dw 2602 286 | dw 2472 287 | dw 2354 288 | dw 2247 289 | dw 2149 290 | dw 2060 291 | dw 1977 292 | dw 1901 293 | dw 1831 294 | dw 1765 295 | dw 1704 296 | dw 1648 297 | dw 1594 298 | dw 1545 299 | dw 1498 300 | dw 1454 301 | dw 1412 302 | dw 1373 303 | dw 1336 304 | dw 1301 305 | dw 1267 306 | dw 1236 307 | dw 1205 308 | dw 1177 309 | dw 1149 310 | dw 1123 311 | dw 1098 312 | dw 1074 313 | dw 1051 314 | dw 1030 315 | dw 1009 316 | dw 988 317 | dw 969 318 | dw 950 319 | dw 932 320 | dw 915 321 | dw 898 322 | dw 882 323 | dw 867 324 | dw 852 325 | dw 838 326 | dw 824 327 | dw 810 328 | dw 797 329 | dw 784 330 | dw 772 331 | dw 760 332 | dw 749 333 | dw 737 334 | dw 727 335 | dw 716 336 | dw 706 337 | dw 696 338 | dw 686 339 | dw 677 340 | dw 668 341 | dw 659 342 | dw 650 343 | dw 642 344 | dw 633 345 | dw 625 346 | dw 618 347 | dw 610 348 | dw 602 349 | dw 595 350 | dw 588 351 | dw 581 352 | dw 574 353 | dw 568 354 | dw 561 355 | dw 555 356 | dw 549 357 | dw 543 358 | dw 537 359 | dw 531 360 | dw 525 361 | dw 520 362 | dw 515 363 | dw 509 364 | dw 504 365 | dw 499 366 | dw 494 367 | dw 489 368 | dw 484 369 | dw 480 370 | dw 475 371 | dw 470 372 | dw 466 373 | dw 462 374 | dw 457 375 | dw 453 376 | dw 449 377 | dw 445 378 | dw 441 379 | dw 437 380 | dw 433 381 | dw 429 382 | dw 426 383 | dw 422 384 | dw 419 385 | dw 415 386 | dw 412 387 | dw 408 388 | dw 405 389 | dw 401 390 | dw 398 391 | dw 395 392 | dw 392 393 | dw 389 394 | dw 386 395 | dw 383 396 | dw 380 397 | dw 377 398 | dw 374 399 | dw 371 400 | dw 368 401 | dw 366 402 | dw 363 403 | dw 360 404 | dw 358 405 | dw 355 406 | dw 353 407 | dw 350 408 | dw 348 409 | dw 345 410 | dw 343 411 | dw 340 412 | dw 338 413 | dw 336 414 | dw 334 415 | dw 331 416 | dw 329 417 | dw 327 418 | dw 325 419 | dw 323 420 | dw 321 421 | dw 318 422 | dw 316 423 | dw 314 424 | dw 312 425 | dw 310 426 | dw 309 427 | dw 307 428 | dw 305 429 | dw 303 430 | dw 301 431 | dw 299 432 | dw 297 433 | dw 296 434 | dw 294 435 | dw 292 436 | dw 290 437 | dw 289 438 | dw 287 439 | dw 285 440 | dw 284 441 | dw 282 442 | dw 280 443 | dw 279 444 | dw 277 445 | dw 276 446 | dw 274 447 | dw 273 448 | dw 271 449 | dw 270 450 | dw 268 451 | dw 267 452 | dw 265 453 | dw 264 454 | dw 262 455 | dw 261 456 | dw 260 457 | dw 258 458 | dw 257 459 | dw 256 460 | dw 254 461 | dw 253 462 | dw 252 463 | dw 250 464 | dw 249 465 | dw 248 466 | dw 247 467 | dw 245 468 | dw 244 469 | dw 243 470 | dw 242 471 | dw 241 472 | dw 240 473 | dw 238 474 | dw 237 475 | dw 236 476 | dw 235 477 | dw 234 478 | dw 233 479 | dw 232 480 | dw 231 481 | dw 229 482 | dw 228 483 | dw 227 484 | dw 226 485 | dw 225 486 | dw 224 487 | dw 223 488 | dw 222 489 | dw 221 490 | dw 220 491 | dw 219 492 | dw 218 493 | dw 217 494 | dw 216 495 | dw 215 496 | dw 214 497 | dw 214 498 | dw 213 499 | dw 212 500 | dw 211 501 | dw 210 502 | dw 209 503 | dw 208 504 | dw 207 505 | dw 206 506 | dw 206 507 | dw 205 508 | dw 204 509 | dw 203 510 | dw 202 511 | dw 201 512 | dw 200 513 | dw 200 514 | dw 199 515 | dw 198 516 | dw 197 517 | dw 196 518 | dw 196 519 | dw 195 520 | dw 194 521 | dw 193 522 | dw 193 523 | 524 | _invLUT: 525 | dw 32767 526 | dw 16384 527 | dw 10922 528 | dw 8192 529 | dw 6553 530 | dw 5461 531 | dw 4681 532 | dw 4096 533 | dw 3640 534 | dw 3276 535 | dw 2978 536 | dw 2730 537 | dw 2520 538 | dw 2340 539 | dw 2184 540 | dw 2048 541 | dw 1927 542 | dw 1820 543 | dw 1724 544 | dw 1638 545 | dw 1560 546 | dw 1489 547 | dw 1424 548 | dw 1365 549 | dw 1310 550 | dw 1260 551 | dw 1213 552 | dw 1170 553 | dw 1129 554 | dw 1092 555 | dw 1057 556 | dw 1024 557 | dw 992 558 | dw 963 559 | dw 936 560 | dw 910 561 | dw 885 562 | dw 862 563 | dw 840 564 | dw 819 565 | dw 799 566 | dw 780 567 | dw 762 568 | dw 744 569 | dw 728 570 | dw 712 571 | dw 697 572 | dw 682 573 | dw 668 574 | dw 655 575 | dw 642 576 | dw 630 577 | dw 618 578 | dw 606 579 | dw 595 580 | dw 585 581 | dw 574 582 | dw 564 583 | dw 555 584 | dw 546 585 | dw 537 586 | dw 528 587 | dw 520 588 | dw 512 589 | dw 504 590 | dw 496 591 | dw 489 592 | dw 481 593 | dw 474 594 | dw 468 595 | dw 461 596 | dw 455 597 | dw 448 598 | dw 442 599 | dw 436 600 | dw 431 601 | dw 425 602 | dw 420 603 | dw 414 604 | dw 409 605 | dw 404 606 | dw 399 607 | dw 394 608 | dw 390 609 | dw 385 610 | dw 381 611 | dw 376 612 | dw 372 613 | dw 368 614 | dw 364 615 | dw 360 616 | dw 356 617 | dw 352 618 | dw 348 619 | dw 344 620 | dw 341 621 | dw 337 622 | dw 334 623 | dw 330 624 | dw 327 625 | dw 324 626 | dw 321 627 | dw 318 628 | dw 315 629 | dw 312 630 | dw 309 631 | dw 306 632 | dw 303 633 | dw 300 634 | dw 297 635 | dw 295 636 | dw 292 637 | dw 289 638 | dw 287 639 | dw 284 640 | dw 282 641 | dw 280 642 | dw 277 643 | dw 275 644 | dw 273 645 | dw 270 646 | dw 268 647 | dw 266 648 | dw 264 649 | dw 262 650 | dw 260 651 | dw 258 652 | dw 256 653 | dw 254 654 | dw 252 655 | dw 250 656 | dw 248 657 | dw 246 658 | dw 244 659 | dw 242 660 | dw 240 661 | dw 239 662 | dw 237 663 | dw 235 664 | dw 234 665 | dw 232 666 | dw 230 667 | dw 229 668 | dw 227 669 | dw 225 670 | dw 224 671 | dw 222 672 | dw 221 673 | dw 219 674 | dw 218 675 | dw 217 676 | dw 215 677 | dw 214 678 | dw 212 679 | dw 211 680 | dw 210 681 | dw 208 682 | dw 207 683 | dw 206 684 | dw 204 685 | dw 203 686 | dw 202 687 | dw 201 688 | dw 199 689 | dw 198 690 | dw 197 691 | dw 196 692 | dw 195 693 | dw 193 694 | dw 192 695 | dw 191 696 | dw 190 697 | dw 189 698 | dw 188 699 | dw 187 700 | dw 186 701 | dw 185 702 | dw 184 703 | dw 183 704 | dw 182 705 | dw 181 706 | dw 180 707 | dw 179 708 | dw 178 709 | dw 177 710 | dw 176 711 | dw 175 712 | dw 174 713 | dw 173 714 | dw 172 715 | dw 171 716 | dw 170 717 | dw 169 718 | dw 168 719 | dw 168 720 | dw 167 721 | dw 166 722 | dw 165 723 | dw 164 724 | dw 163 725 | dw 163 726 | dw 162 727 | dw 161 728 | dw 160 729 | dw 159 730 | dw 159 731 | dw 158 732 | dw 157 733 | dw 156 734 | dw 156 735 | dw 155 736 | dw 154 737 | dw 153 738 | dw 153 739 | dw 152 740 | dw 151 741 | dw 151 742 | dw 150 743 | dw 149 744 | dw 148 745 | dw 148 746 | dw 147 747 | dw 146 748 | dw 146 749 | dw 145 750 | dw 144 751 | dw 144 752 | dw 143 753 | dw 143 754 | dw 142 755 | dw 141 756 | dw 141 757 | dw 140 758 | dw 140 759 | dw 139 760 | dw 138 761 | dw 138 762 | dw 137 763 | dw 137 764 | dw 136 765 | dw 135 766 | dw 135 767 | dw 134 768 | dw 134 769 | dw 133 770 | dw 133 771 | dw 132 772 | dw 132 773 | dw 131 774 | dw 131 775 | dw 130 776 | dw 130 777 | dw 129 778 | dw 129 779 | dw 128 780 | -------------------------------------------------------------------------------- /src/quad/matrix.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | ;TODO: convert to 4.12 fixed point 4 | 5 | public _qdTransformVertices 6 | public _projectVertices 7 | public _projectSprites 8 | public _setCameraPosition 9 | 10 | public _matrixRoutine 11 | public _matrixRoutine_len 12 | public _matrixRoutine_src 13 | 14 | extern canvas_width 15 | extern canvas_height 16 | extern canvas_offset 17 | 18 | extern _qdVertexCache 19 | extern _qdCameraMatrix 20 | 21 | extern _getReciprocal 22 | extern _MultiplyHLBC 23 | extern _recipTable 24 | extern mulAngle 25 | 26 | extern _ZinvLUT 27 | 28 | ; outcodes 29 | outTop equ 01000b 30 | outBottom equ 0100b 31 | outLeft equ 0010b 32 | outRight equ 0001b 33 | outOOB equ $FF 34 | 35 | ; matrix struct 36 | m00 equ iy+0 37 | m01 equ iy+2 38 | m02 equ iy+4 39 | m10 equ iy+6 40 | m11 equ iy+8 41 | m12 equ iy+10 42 | m20 equ iy+12 43 | m21 equ iy+14 44 | m22 equ iy+16 45 | cx equ iy+18 46 | cy equ iy+20 47 | cz equ iy+22 48 | 49 | ; vertex cache 50 | 51 | xs equ iy+0 52 | ys equ iy+2 53 | depth equ iy+4 54 | outcode equ iy+5 55 | rs1 equ iy+6 56 | rs2 equ iy+7 57 | 58 | ; sprite defines 59 | 60 | spriteX equ ix+0 61 | spriteY equ ix+2 62 | spriteZ equ ix+4 63 | spriteU equ ix+6 64 | spriteV equ ix+7 65 | spriteHW equ ix+8 66 | spriteHH equ ix+9 67 | sdepth equ ix+10 68 | sxs equ ix+11 69 | sxe equ ix+13 70 | sys equ ix+15 71 | sye equ ix+17 72 | 73 | 74 | mulRow:=$E10010 ; E10010 or $E30B00 depending on OS revision 75 | 76 | macro shlhl 77 | repeat 4 78 | add hl,hl 79 | end repeat 80 | end macro 81 | 82 | macro shrhl 83 | repeat 4 84 | sra h 85 | rr l 86 | end repeat 87 | end macro 88 | 89 | ;ix = vertex 90 | ;iy = matrix row 91 | ;destroys b' & iy 92 | mulRowPosition_src: 93 | exx 94 | ld b,3 95 | .loop: 96 | exx 97 | ld hl,(ix+0) 98 | ld bc,(iy+0) 99 | call mulAngle 100 | add.sis hl,sp 101 | ld.sis sp,hl 102 | exx 103 | lea ix,ix+2 104 | lea iy,iy+2 105 | djnz .loop 106 | lea ix,ix-6 107 | pop iy 108 | exx 109 | ret 110 | mulRowPosition_len:= $ - mulRowPosition_src 111 | assert mulRowPosition_len <= 64 112 | 113 | mulRowVertex_src: 114 | ld b,3 115 | .loop: 116 | ld c,(ix+0) 117 | ld de,(iy+0) 118 | ld h,e 119 | ld l,c 120 | mlt hl 121 | ld l,h 122 | xor a,a 123 | bit 7,d 124 | jr Z,$+3 125 | sub a,c 126 | ld h,a 127 | ld e,c 128 | mlt de 129 | add hl,de 130 | add.sis hl,sp 131 | ld.sis sp,hl 132 | inc ix 133 | lea iy,iy+2 134 | djnz .loop 135 | lea ix,ix-3 136 | pop iy 137 | ret 138 | mulRowVertex_len:= $ - mulRowVertex_src 139 | assert mulRowVertex_len <= 64 140 | 141 | ;--------------------------------------------------------- 142 | ; iy = matrix to load 143 | _setCameraPosition: 144 | push ix 145 | 146 | ;load smc bytes 147 | ld de,mulRow 148 | ld hl,mulRowPosition_src 149 | ld bc,mulRowPosition_len 150 | ldir 151 | lea hl,m00 152 | ld (SMCLoadM00),hl 153 | lea hl,m10 154 | ld (SMCLoadM10),hl 155 | lea hl,m20 156 | ld (SMCLoadM20),hl 157 | 158 | ld a,$e3 159 | ld mb,a 160 | or a,a 161 | sbc hl,hl 162 | ld.sis (SMCLoadX - $e30000),hl 163 | ld.sis (SMCLoadY - $e30000),hl 164 | ld.sis (SMCLoadZ - $e30000),hl 165 | 166 | ld ix,offx ; calculate M*<-128,-128,-128> for object offsets 167 | ld de,-128 168 | ld (ix),de 169 | ld (ix+2),de 170 | ld (ix+4),de 171 | call _matrixRow0Multiply 172 | push hl 173 | call _matrixRow1Multiply 174 | push hl 175 | call _matrixRow2Multiply 176 | pop de 177 | pop bc 178 | ld (ix),bc 179 | ld (ix+2),de 180 | ld (ix+4),hl 181 | 182 | lea ix,cx ; M*camera position 183 | call _matrixRow0Multiply 184 | ex de,hl 185 | or a,a 186 | sbc hl,hl 187 | sbc hl,de 188 | push hl 189 | call _matrixRow1Multiply 190 | ex de,hl 191 | or a,a 192 | sbc hl,hl 193 | sbc hl,de 194 | push hl 195 | call _matrixRow2Multiply 196 | ex de,hl 197 | or a,a 198 | sbc hl,hl 199 | sbc hl,de 200 | pop de 201 | pop bc 202 | ld.sis (SMCLoadX - $e30000),bc 203 | ld.sis (SMCLoadY - $e30000),de 204 | ld.sis (SMCLoadZ - $e30000),hl 205 | ld (tx),bc 206 | ld (ty),de 207 | ld (tz),hl 208 | 209 | ld a,$d0 210 | ld mb,a 211 | pop ix 212 | ret 213 | 214 | ; camera translation 215 | tx: rb 3 216 | ty: rb 3 217 | tz: rb 3 218 | ; object center offset 219 | offx: rb 2 220 | offy: rb 2 221 | offz: rb 3 222 | 223 | ;--------------------------------------------------------- 224 | _qdTransformVertices: 225 | push ix 226 | ld ix,6 227 | add ix,sp 228 | 229 | ld iy,(ix+0) 230 | call _setCameraPosition 231 | ld a,$e3 232 | ld mb,a 233 | 234 | ld hl,(offx) 235 | ld de,128 236 | add hl,de 237 | shlhl 238 | ld.sis (SMCLoadX - $e30000),hl 239 | 240 | ld hl,(offy) 241 | add hl,de 242 | shlhl 243 | ld.sis (SMCLoadY - $e30000),hl 244 | 245 | ld hl,(offz) 246 | add hl,de 247 | shlhl 248 | ld.sis (SMCLoadZ - $e30000),hl 249 | 250 | ld a,$d0 251 | ld mb,a 252 | 253 | ld de,mulRow 254 | ld hl,mulRowVertex_src 255 | ld bc,mulRowVertex_len 256 | ldir 257 | 258 | ld iy,(ix+6) 259 | ld hl,(ix+9) 260 | ld ix,(ix+3) 261 | ld de,1 262 | .loop: 263 | exx 264 | call _matrixRow0Multiply 265 | xor a,a 266 | shrhl 267 | adc a,l 268 | ld l,a 269 | push hl 270 | call _matrixRow1Multiply 271 | xor a,a 272 | shrhl 273 | adc a,l 274 | ld l,a 275 | push hl 276 | call _matrixRow2Multiply 277 | xor a,a 278 | shrhl 279 | adc a,l 280 | ld (iy+2),a 281 | pop hl 282 | ld (iy+1),l 283 | pop hl 284 | ld (iy+0),l 285 | lea ix,ix+3 ; next vertex 286 | lea iy,iy+3 287 | exx 288 | or a,a 289 | sbc hl,de 290 | jr nz,.loop 291 | pop ix 292 | ret 293 | 294 | ;--------------------------------------------------------- 295 | 296 | ; iy = object pointer 297 | _projectVertices: 298 | push iy 299 | push bc 300 | 301 | lea ix,iy+0 302 | ld iy,_qdCameraMatrix 303 | 304 | ; load position multiply routine 305 | ld de,mulRow 306 | ld hl,mulRowPosition_src 307 | ld bc,mulRowPosition_len 308 | ldir 309 | 310 | ld a,$e3 311 | ld mb,a 312 | or a,a 313 | sbc hl,hl 314 | ld.sis (SMCLoadX - $e30000),hl 315 | ld.sis (SMCLoadY - $e30000),hl 316 | ld.sis (SMCLoadZ - $e30000),hl 317 | 318 | ; transform object position 319 | call _matrixRow0Multiply 320 | ld de,(tx) 321 | ld bc,(offx) 322 | add hl,de 323 | add hl,bc 324 | shlhl 325 | ld.sis (SMCLoadX - $e30000),hl 326 | 327 | call _matrixRow1Multiply 328 | ld de,(ty) 329 | ld bc,(offy) 330 | add hl,de 331 | add hl,bc 332 | shlhl 333 | ld.sis (SMCLoadY - $e30000),hl 334 | 335 | call _matrixRow2Multiply 336 | ld de,(tz) 337 | ld bc,(offz) 338 | add hl,de 339 | add hl,bc 340 | shlhl 341 | ld.sis (SMCLoadZ - $e30000),hl 342 | ld a,$d0 343 | ld mb,a 344 | 345 | ; load vertex multiply routine 346 | ld de,mulRow 347 | ld hl,mulRowVertex_src 348 | ld bc,mulRowVertex_len 349 | ldir 350 | 351 | ld de,(ix+6) ; de = vertex count 352 | ld ix,(ix+10) ; ix = vertex pointer 353 | 354 | ld iy,_qdVertexCache 355 | ex.sis de,hl 356 | ld de,1 357 | jp projloop 358 | 359 | ;--------------------------------------------------------- 360 | virtual at $E308E0 361 | _matrixRoutine: 362 | 363 | projloop: 364 | exx 365 | ; get z' 366 | call _matrixRow2Multiply 367 | shrhl 368 | ld (depth),l 369 | 370 | xor a,a 371 | cp a,l 372 | jq Z,.earlyZ 373 | cp a,h 374 | jq Z,.skipEarlyZ 375 | .earlyZ: 376 | ld (outcode),$FF ; out of range 377 | jq .skipVert 378 | .skipEarlyZ: 379 | dec l 380 | add hl,hl 381 | ld de,_ZinvLUT 382 | add hl,de 383 | ld hl,(hl) 384 | 385 | push hl 386 | push hl 387 | 388 | ; height/2 - y'*f/z' 389 | call _matrixRow1Multiply 390 | pop bc 391 | call mulHLBC 392 | shrhl 393 | ex de,hl 394 | ld hl,canvas_height/2 395 | or a,a 396 | sbc hl,de 397 | ld (ys),l 398 | ld (ys+1),h 399 | 400 | ;offset y value for easier bounds checking 401 | ld de,16 402 | add hl,de 403 | ; out of bounds = y<0 or y>255 404 | xor a,a 405 | cp a,h 406 | jr Z,.topY 407 | pop bc 408 | ld (outcode),$FF 409 | jr .skipVert 410 | ; top outcode 411 | .topY: 412 | ld h,a 413 | ld a,l 414 | cp a,16 415 | rl h ; set if x < 0 416 | ; bottom outcode 417 | cp a,canvas_height+15 418 | ccf 419 | ld a,h 420 | rla 421 | ex af,af' 422 | 423 | call _matrixRow0Multiply 424 | ; 256/2 + x'*f/z' 425 | ;de*bc 426 | pop bc 427 | call mulHLBC 428 | shrhl 429 | ld de,256/2 430 | add hl,de 431 | ld (xs),l 432 | ld (xs+1),h 433 | 434 | ; out of bounds = x<0 or x>255 435 | xor a,a 436 | cp a,h 437 | jr Z,.leftX 438 | ld (outcode),$FF 439 | jr .skipVert 440 | ; left outcode 441 | .leftX: 442 | ex af,af' 443 | ld h,a 444 | ld a,l 445 | cp a,canvas_offset 446 | rl h ; set if x less than 447 | ; right outcode 448 | cp a,canvas_width+canvas_offset 449 | ccf ; carry clear if x greater than, so invert carry 450 | rl h 451 | 452 | ld (outcode),h 453 | ; copy UV for sprites 454 | 455 | .skipVert: 456 | exx 457 | lea ix,ix+3 ; next vertex 458 | lea iy,iy+8 ; next cache entry 459 | or a,a 460 | sbc hl,de ; count-- 461 | jq nz,projloop 462 | 463 | pop bc 464 | pop iy 465 | ret 466 | 467 | ;--------------------------------------------------------- 468 | ; in: b = sprite count 469 | ; ix = sprite ptr 470 | _projectSprites: 471 | ; load 16-bit matrix routine 472 | ld iy,_qdVertexCache ; iy = vertex cache pointer 473 | push ix 474 | push bc 475 | push bc 476 | 477 | ld de,mulRow 478 | ld hl,mulRowPosition_src 479 | ld bc,mulRowPosition_len 480 | ldir 481 | 482 | pop bc 483 | ld c,b 484 | spriteloop: 485 | exx 486 | ; get z' 487 | call _matrixRow2Multiply 488 | ld (sdepth),l 489 | ; skip if z<=0 490 | xor a,a 491 | cp a,l 492 | jq Z,.skipSprite 493 | cp a,h 494 | jq nz,.skipSprite 495 | ; fetch f/z 496 | dec l 497 | add hl,hl 498 | ld de,_ZinvLUT 499 | add hl,de 500 | ld hl,(hl) ;hl = f/z 501 | push hl 502 | 503 | call _matrixRow0Multiply 504 | ; 256/2 + x'*f/z' 505 | ;de*bc 506 | pop bc 507 | push bc 508 | call mulHLBC 509 | ld de,256/2 510 | add hl,de 511 | 512 | ;xe = xs + w*f/2z 513 | ;xs -= (w*f/2z)/2 514 | pop bc ; bc = f/z * 1/2 515 | push bc 516 | srl b 517 | rr c 518 | push hl ; push xs 519 | ld a,(spriteHW) 520 | ; bc*a 521 | ld h,c 522 | ld l,a 523 | mlt hl 524 | ld l,h 525 | ld h,0 526 | ld c,a 527 | mlt bc 528 | add hl,bc 529 | ex de,hl 530 | pop hl 531 | add hl,de 532 | ; skip if xe < canvas_offset 533 | ld bc,canvas_offset 534 | or a,a 535 | sbc.sis hl,bc 536 | jq m,.skipSpritePop 537 | jq Z,.skipSpritePop 538 | add hl,bc 539 | ld (sxe),hl 540 | or a,a 541 | sbc hl,de 542 | or a,a 543 | sbc hl,de ;hl = xs - (w*f/z)/2 544 | ; skip if xs >= width+offset 545 | ld de,canvas_width+canvas_offset-1 546 | or a,a 547 | sbc hl,de 548 | bit 7,h 549 | jq Z,.skipSpritePop 550 | add hl,de 551 | ld (sxs),l 552 | ld (sxs+1),h 553 | 554 | 555 | ; ys = height/2 - y' 556 | call _matrixRow1Multiply 557 | pop bc 558 | push bc ; bc = f/z 559 | call mulHLBC 560 | ex de,hl 561 | ld hl,canvas_height/2 562 | or a,a 563 | sbc hl,de 564 | 565 | ;ye = ys + h*f/2z 566 | ;ys -= (h*f/2z)/2 567 | pop bc ; bc = f/z * 1/2 568 | srl b 569 | rr c 570 | push hl ; push ys 571 | ld a,(spriteHH) 572 | ; bc*a 573 | ld h,c 574 | ld l,a 575 | mlt hl 576 | ld l,h 577 | ld h,0 578 | ld c,a 579 | mlt bc 580 | add hl,bc 581 | ex de,hl 582 | pop hl 583 | add hl,de 584 | ; skip if ye <= 0 585 | bit 7,h 586 | jq nz,.skipSprite 587 | ld (sye),l 588 | ld (sye+1),h 589 | or a,a 590 | sbc hl,de 591 | or a,a 592 | sbc hl,de ;hl = ys - (h*f/z)/2 593 | ; skip if ys >= height 594 | ld de,canvas_height 595 | or a,a 596 | sbc hl,de 597 | bit 7,h 598 | jq Z,.skipSprite 599 | add hl,de 600 | ld (sys),l 601 | ld (sys+1),h 602 | 603 | .next: 604 | lea ix,ix+19 ; next sprite 605 | exx 606 | dec c ; count-- 607 | jq nz,spriteloop 608 | pop bc 609 | pop ix 610 | ret 611 | 612 | .skipSpritePop: 613 | pop hl 614 | .skipSprite: 615 | ld (sdepth),$FF 616 | jq .next 617 | 618 | 619 | 620 | ; hl = de*bc (bc is fixed point with bc>0) 621 | mulHLBC: 622 | ex de,hl 623 | ld h,d 624 | ld l,b 625 | mlt hl 626 | ld a,l 627 | bit 7,d 628 | jr Z,$+3 629 | sub a,c 630 | ld h,e 631 | ld l,c 632 | mlt hl 633 | ld l,h 634 | ld h,a 635 | ld a,b 636 | ld b,d 637 | ld d,a 638 | mlt de 639 | mlt bc 640 | add hl,de 641 | add hl,bc 642 | ret 643 | 644 | ;--------------------------------------------------------- 645 | _matrixRow0Multiply: 646 | push iy 647 | ld.sis sp,0 648 | SMCLoadX:= $ - 2 649 | ld iy,0 650 | SMCLoadM00:= $ - 3 651 | jp mulRow 652 | 653 | ;--------------------------------------------------------- 654 | _matrixRow1Multiply: 655 | push iy 656 | ld.sis sp,0 657 | SMCLoadY:= $ - 2 658 | ld iy,0 659 | SMCLoadM10:= $ - 3 660 | jp mulRow 661 | 662 | ;--------------------------------------------------------- 663 | _matrixRow2Multiply: 664 | push iy 665 | ld.sis sp,0 666 | SMCLoadZ:= $ - 2 667 | ld iy,0 668 | SMCLoadM20:= $ - 3 669 | jp mulRow 670 | 671 | assert $<$E30B00 672 | load _matrixroutine_data: $-$$ from $$ 673 | _matrixRoutine_len := $-$$ 674 | end virtual 675 | _matrixRoutine_src: 676 | db _matrixroutine_data 677 | -------------------------------------------------------------------------------- /src/quad/matrix.h: -------------------------------------------------------------------------------- 1 | 2 | //24 bytes 3 | // 4.12 fixed point matrix with a 16 bit position 4 | typedef struct { 5 | int16_t m00,m01,m02; 6 | int16_t m10,m11,m12; 7 | int16_t m20,m21,m22; 8 | int16_t x,y,z; 9 | } qdMatrix; 10 | 11 | 12 | // transforms source vertices and stores them at the destination(Safe for self modification) 13 | void qdTransformVertices(qdMatrix* matrix,qdVertex* src,qdVertex* dest,int num); 14 | 15 | // builds a matrix from provided angles 16 | void qdEulerToMatrix(qdMatrix* matrix,uint16_t ax,uint16_t ay,uint16_t az); 17 | 18 | -------------------------------------------------------------------------------- /src/quad/ports.asm: -------------------------------------------------------------------------------- 1 | ; Copyright 2015-2022 Matt "MateoConLechuga" Waltz 2 | ; 3 | ; Redistribution and use in source and binary forms, with or without 4 | ; modification, are permitted provided that the following conditions are met: 5 | ; 6 | ; 1. Redistributions of source code must retain the above copyright notice, 7 | ; this list of conditions and the following disclaimer. 8 | ; 9 | ; 2. Redistributions in binary form must reproduce the above copyright notice, 10 | ; this list of conditions and the following disclaimer in the documentation 11 | ; and/or other materials provided with the distribution. 12 | ; 13 | ; 3. Neither the name of the copyright holder nor the names of its contributors 14 | ; may be used to endorse or promote products derived from this software 15 | ; without specific prior written permission. 16 | ; 17 | ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 | ; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21 | ; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 | ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 | ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 | ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 | ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 | ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 | ; POSSIBILITY OF SUCH DAMAGE. 28 | 29 | include 'ti84pceg.inc' 30 | 31 | section .text 32 | 33 | public port_setup 34 | public port_unlock 35 | public port_lock 36 | 37 | port_setup: 38 | di 39 | 40 | ld hl,_port_src 41 | ld de,_port_org 42 | ld bc,_port_len 43 | ldir 44 | 45 | ld b,1 46 | or a,a 47 | sbc hl,hl 48 | .find: 49 | ld a,(hl) 50 | inc hl 51 | cp a,$80 52 | jq z,.found_80 53 | cp a,$ed 54 | jq nz,.find 55 | ld a,(hl) 56 | sub a,$41 57 | jq z,.found_ed41 58 | cp a,$73 59 | jq nz,.find 60 | dec b 61 | dec hl 62 | ld (port_new.target),hl 63 | inc hl 64 | jq .find 65 | .found_80: 66 | ld a,(hl) 67 | cp a,$0f 68 | jq nz,.find 69 | and a,b 70 | ret nz 71 | ld hl,port_new.unlock 72 | jq .store_smc 73 | .found_ed41: 74 | dec hl 75 | ld (port_old.target),hl 76 | inc hl 77 | push hl 78 | pop iy 79 | bit 0,(iy+4) 80 | jq nz,.find 81 | ld hl,port_old.unlock 82 | .store_smc: 83 | ld (port_unlock.code),hl 84 | ret 85 | 86 | port_read: 87 | push ix 88 | call port_old.read 89 | jr port_lock.pop 90 | 91 | port_write: 92 | push ix 93 | call port_old.write 94 | jr port_lock.pop 95 | 96 | port_unlock: 97 | push ix 98 | call 0 99 | .code := $-3 100 | jr port_lock.pop 101 | 102 | port_lock: 103 | push ix 104 | call port_new.lock 105 | .pop: 106 | pop ix 107 | ret 108 | 109 | virtual at $D006C0 ;textShadow 110 | _port_org: 111 | 112 | port_old: 113 | .unlock: 114 | call .unlockhelper 115 | .unlockfinish: 116 | ld a,$D1 ; $D0007C0 is new priv top 117 | out0 ($25),a 118 | ld a,$FF 119 | out0 ($24),a 120 | ld a,$FF 121 | out0 ($23),a 122 | 123 | in0 a,($06) 124 | or a,4 125 | out0 ($06),a 126 | ret 127 | .unlockhelper: 128 | call ti._frameset0 129 | push de 130 | ld bc,$0022 131 | jp 0 132 | .target := $-3 133 | .write: 134 | ld de,$c979ed 135 | ld hl,ti.heapBot - 3 136 | ld (hl),de 137 | jp (hl) 138 | .read: 139 | ld de,$c978ed 140 | ld hl,ti.heapBot - 3 141 | ld (hl),de 142 | jp (hl) 143 | 144 | port_new: 145 | .unlock: 146 | ld de,$d19881 147 | push de 148 | or a,a 149 | sbc hl,hl 150 | push hl 151 | ld de,$03d1 152 | push de 153 | push hl 154 | call .unlockhelper 155 | ld hl,12 156 | add hl,sp 157 | ld sp,hl 158 | jq port_old.unlockfinish 159 | .unlockhelper: 160 | push hl 161 | ex (sp),ix 162 | add ix,sp 163 | push hl 164 | push de 165 | ld de,$887c00 166 | push de 167 | ld bc,$10de 168 | ld de,$0f22 169 | add hl,sp 170 | jp 0 171 | .target := $-3 172 | .lock: 173 | xor a,a 174 | out0 ($28),a 175 | ld a,$D1 ; reset priv range 176 | out0 ($25),a 177 | ld a,$88 178 | out0 ($24),a 179 | ld a,$7C 180 | out0 ($23),a 181 | 182 | ld a,$d1 183 | out0 ($22),a 184 | ret 185 | 186 | assert $-$$<260 187 | load _port_data : $-$$ from $$ 188 | _port_len := $-$$ 189 | end virtual 190 | 191 | _port_src: 192 | db _port_data 193 | 194 | 195 | 196 | -------------------------------------------------------------------------------- /src/quad/quad.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _qdInit 4 | public _qdClose 5 | 6 | public _qdVertexCache 7 | public _qdFaceBucket 8 | public _qdFaceCache 9 | public _qdCameraMatrix 10 | 11 | ;variable defines 12 | _qdFaceBucket:=$D40000 + 256*120 13 | _qdVertexCache:=$D48000 + 256*96 14 | _qdCameraMatrix:=$D50000 ; 24 bytes 15 | _qdFaceCache:=$D50000 + 44 ; 20 bytes per entry 16 | 17 | ; running count of memory locations used: 18 | ; D40000 - D52C00 19 | ; E30880 - E30BFF 20 | ; D006C0 - D007C0 21 | 22 | _qdInit: 23 | ; initialize screen 24 | ; sets screen buffer to $D52C00. $D40000 reserved for canvas and texture page( so no double buffering by default) 25 | ; note: possible to double buffer if using 160x240 interlace trick 26 | call _gfx_Begin 27 | call _gfx_ZeroScreen 28 | call _gfx_SwapDraw 29 | call _gfx_ZeroScreen 30 | call _gfx_SwapDraw 31 | or a, a 32 | sbc hl, hl 33 | push hl 34 | call _gfx_SetDraw 35 | pop bc 36 | 37 | di 38 | 39 | ; unlock ports for SHA256 scratch area at $E10010 40 | call port_setup 41 | call port_unlock 42 | in a,($06) 43 | set 2,a 44 | out ($06),a 45 | call port_lock 46 | 47 | ; load routines into fastRam 48 | ld de,_shaderRoutine 49 | ld hl,_shaderRoutine_src 50 | ld bc,_shaderRoutine_len 51 | ldir 52 | 53 | ld de,_matrixRoutine 54 | ld hl,_matrixRoutine_src 55 | ld bc,_matrixRoutine_len 56 | ldir 57 | 58 | call _qdResetCache 59 | ret 60 | 61 | _qdClose: 62 | jp _gfx_End 63 | 64 | 65 | 66 | extern _gfx_Begin 67 | extern _gfx_ZeroScreen 68 | extern _gfx_SwapDraw 69 | extern _gfx_SetDraw 70 | extern _gfx_End 71 | 72 | extern port_setup 73 | extern port_unlock 74 | extern port_lock 75 | 76 | extern _shaderRoutine 77 | extern _shaderRoutine_len 78 | extern _shaderRoutine_src 79 | 80 | extern _matrixRoutine 81 | extern _matrixRoutine_src 82 | extern _matrixRoutine_len 83 | 84 | extern _qdResetCache 85 | 86 | -------------------------------------------------------------------------------- /src/quad/quad.h: -------------------------------------------------------------------------------- 1 | #ifndef QUADRENDERER 2 | #define QUADRENDERER 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "fxmath.h" 13 | #include "def3d.h" 14 | #include "matrix.h" 15 | 16 | /* 17 | TODO: proper usage documentation 18 | 19 | Quad3D is a 3D rendering library designed for the TI84+CE. 20 | It is designed to be used on top of the GraphX C library. 21 | 22 | Quad3D uses the first 75 KB of VRAM for internal use, and thus double buffering cannot be used in GraphX. 23 | */ 24 | 25 | #define loadTextureMapCompressed(y,ptr) zx7_Decompress((void *)0xD48000 + 256*(y),(void *)ptr) 26 | 27 | // camera matrix 28 | extern qdMatrix qdCameraMatrix; 29 | 30 | // initializes renderer 31 | void qdInit(void); 32 | 33 | // resets renderer 34 | void qdClose(void); 35 | 36 | // blits the Canvas to the Screen. 37 | void qdBlitCanvas(uint8_t* buffer); 38 | 39 | // clears the canvas 40 | void qdClearCanvas(void); 41 | 42 | // renders objects and sprites to canvas. 43 | //void qdRender(void); 44 | 45 | // render an array of billboard sprites. 46 | void qdRenderSprites(qdSprite* sprites,uint8_t numSprites); 47 | 48 | // render an object 49 | void qdRenderObject(qdObject* object); 50 | 51 | // uses render information to draw screen. 52 | // flushes render caches. 53 | void qdDraw(); 54 | 55 | #define qdSetCameraAngle(ax,ay,az) qdEulerToMatrix(&qdCameraMatrix,ax,ay,az) 56 | 57 | #define qdSetCameraPosition(a,b,c) qdCameraMatrix.x = a; \ 58 | qdCameraMatrix.y = b; \ 59 | qdCameraMatrix.z = c; 60 | 61 | // visible faces cache 62 | // filled by render functions 63 | // ~11 kb 64 | extern volatile struct qd_face_cached qdFaceCache[512]; 65 | 66 | // face bucket linked lists 67 | // stores indices for the first face at each distance 68 | // 2 kb 69 | extern volatile uint16_t qdFaceBucket[1024]; 70 | 71 | #endif -------------------------------------------------------------------------------- /src/quad/render.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _qdResetCache 4 | public _qdRenderSprites 5 | public _qdRenderObject 6 | public _qdDraw 7 | 8 | 9 | ; outcodes 10 | outTop equ 01000b 11 | outBottom equ 0100b 12 | outLeft equ 0010b 13 | outRight equ 0001b 14 | outOOB equ $FF 15 | 16 | ; face 17 | shader equ iy+0 18 | light equ iy+1 19 | u0 equ iy+2 20 | v0 equ iy+3 21 | vt0 equ iy+4 22 | vt1 equ iy+6 23 | vt2 equ iy+8 24 | vt3 equ iy+10 25 | 26 | ; stack vars at $E30B80 27 | ixVars:=$E30B80 28 | 29 | numFaces equ ix+0 30 | cachePointer equ ix+3 31 | bucketMin equ ix+6 32 | bucketMax equ ix+9 33 | facePointer equ ix+12 34 | 35 | x0 equ ix+15 36 | y0 equ ix+17 37 | depth0 equ ix+19 38 | outcode0 equ ix+20 39 | x1 equ ix+21 40 | y1 equ ix+23 41 | depth1 equ ix+25 42 | outcode1 equ ix+26 43 | x2 equ ix+27 44 | y2 equ ix+29 45 | depth2 equ ix+31 46 | outcode2 equ ix+32 47 | x3 equ ix+33 48 | y3 equ ix+35 49 | depth3 equ ix+37 50 | outcode3 equ ix+38 51 | 52 | ; sprite vars 53 | spriteX equ ix+0 54 | spriteY equ ix+2 55 | spriteZ equ ix+4 56 | spriteU equ ix+6 57 | spriteV equ ix+7 58 | spriteHW equ ix+8 59 | spriteHH equ ix+9 60 | sdepth equ ix+10 61 | sxs equ ix+11 62 | sxe equ ix+13 63 | sys equ ix+15 64 | sye equ ix+17 65 | 66 | ; face cache vars 67 | tshader equ iy+0 68 | tlight equ iy+1 69 | tu0 equ iy+2 70 | tv0 equ iy+3 71 | tx0 equ iy+4 72 | ty0 equ iy+5 73 | tay equ iy+6 74 | tax equ iy+8 75 | tby equ iy+10 76 | tbx equ iy+12 77 | tcy equ iy+14 78 | tcx equ iy+16 79 | tnext equ iy+18 80 | 81 | txlen equ iy+2 82 | tylen equ iy+3 83 | tustart equ iy+6 84 | tvstart equ iy+9 85 | tdelta equ iy+12 86 | 87 | _qdResetCache: 88 | push ix 89 | ld ix,ixVars 90 | 91 | ; init face buckets 92 | ld hl,_qdFaceBucket 93 | ld de,_qdFaceBucket+1 94 | ld (hl),$FF 95 | ld bc,2047 96 | ldir 97 | ; init variables 98 | ld (numFaces),bc 99 | ld (bucketMax),bc 100 | ld bc,1024 101 | ld (bucketMin),bc 102 | ld bc,_qdFaceCache 103 | ld (cachePointer),bc 104 | pop ix 105 | ret 106 | 107 | ; process sprites 108 | _qdRenderSprites: 109 | ; load camera matrix 110 | ld iy,_qdCameraMatrix 111 | call _setCameraPosition 112 | pop de 113 | pop iy 114 | pop hl 115 | push hl 116 | push iy 117 | push de 118 | 119 | ld a,l 120 | or a,a ; return if numSprites = 0 121 | ret z 122 | ld b,a ; b = sprite count 123 | 124 | push ix 125 | lea ix,iy+0 ; ix = sprite ptr 126 | call _projectSprites 127 | ld iy,(ixVars+3) ; iy = (cachePointer) 128 | .loop: 129 | exx 130 | ; skip if sprite depth = $FF 131 | ld a,(sdepth) 132 | cp a,$FF 133 | jq Z,.skip 134 | 135 | 136 | or a,a 137 | sbc hl,hl 138 | ld h,(spriteU) 139 | ld (tustart),hl 140 | ld h,(spriteV) 141 | ld (tvstart),hl 142 | ld h,l 143 | 144 | ;delta = 2.5 * z 145 | ld l,a 146 | push hl 147 | add hl,hl 148 | ld de,0 149 | ld e,a 150 | srl e 151 | add hl,de 152 | ld (tdelta),hl 153 | 154 | ; depth bucket 155 | pop hl 156 | add hl,hl 157 | add hl,hl 158 | dec hl 159 | push hl 160 | 161 | ld (tshader),$80 ; sprite shader 162 | ;clip sxs 163 | ld hl,(sxs) 164 | ld (tx0),l 165 | ld de,canvas_offset 166 | or a,a 167 | sbc.sis hl,de 168 | call m,correctU ; correct ustart and x0 if sxs= 0 406 | bit 7,h 407 | jq Z,loadFacePointer 408 | 409 | 410 | ld de,64 411 | ld a,(tshader) 412 | ; if area>=-64 then use half size shader 413 | add hl,de 414 | bit 7,h 415 | jq nz,.skipHalf 416 | set 2,a 417 | .skipHalf: 418 | add hl,de 419 | add hl,de 420 | add hl,de 421 | ; if area<-256 then use double pixel shader 422 | bit 7,h 423 | jq Z,.skipChunky 424 | set 1,a 425 | .skipChunky: 426 | ld (tshader),a 427 | 428 | ; find sum of distances (8.2 average) 429 | or a,a 430 | sbc hl,hl 431 | ex de,hl 432 | or a,a 433 | sbc hl,hl 434 | ld l,(depth0) 435 | ld e,(depth1) 436 | add hl,de 437 | ld e,(depth2) 438 | add hl,de 439 | ld e,(depth3) 440 | add hl,de 441 | 442 | ld de,1023 443 | or a,a 444 | sbc hl,de 445 | jq p,loadFacePointer 446 | 447 | add hl,de 448 | dec hl 449 | ; update min and max buckets 450 | ex de,hl 451 | ld hl,(bucketMax) 452 | or a,a 453 | sbc hl,de 454 | jr nc,$+5 455 | ld (bucketMax),de 456 | 457 | ld hl,(bucketMin) 458 | or a,a 459 | sbc hl,de 460 | jr c,$+5 461 | ld (bucketMin),de 462 | ; update this face's bucket 463 | ld hl,_qdFaceBucket 464 | add hl,de 465 | add hl,de 466 | ld bc,(hl) 467 | ld (tnext),bc 468 | ld de,(numFaces) 469 | ld (hl),e 470 | inc hl 471 | ld (hl),d 472 | inc de 473 | ld (numFaces),de 474 | 475 | ld a,(x0) 476 | ld (tx0),a 477 | ld a,(y0) 478 | ld (ty0),a 479 | 480 | ld a,(tshader) 481 | ; cy = y3 - y0 482 | ld hl,(y3) 483 | ld b,h 484 | ld c,l 485 | ld de,(y0) 486 | or a,a 487 | sbc hl,de 488 | ld sp,hl 489 | add hl,hl 490 | add hl,hl 491 | add hl,hl 492 | add hl,hl 493 | add hl,sp 494 | bit 2,a 495 | jr Z,$+3 496 | add hl,hl 497 | ld (tcy),hl 498 | 499 | ; by = y1 - y0 500 | ld hl,(y1) 501 | or a,a 502 | sbc hl,de 503 | ld d,h 504 | ld e,l 505 | add hl,hl 506 | add hl,hl 507 | add hl,hl 508 | add hl,hl 509 | add hl,de 510 | bit 2,a 511 | jr Z,$+3 512 | add hl,hl 513 | ld (tby),hl 514 | 515 | ; ay = y0 - y1 - y3 + y2 = y2 - by - y3 516 | ld hl,(y2) 517 | or a,a 518 | sbc hl,de 519 | or a,a 520 | sbc hl,bc 521 | bit 2,a 522 | jr Z,$+4 523 | add hl,hl 524 | add hl,hl 525 | ld (tay),hl 526 | 527 | ;cx = x3 - x0 528 | ld hl,(x3) 529 | ld b,h 530 | ld c,l 531 | ld de,(x0) 532 | or a,a 533 | sbc hl,de 534 | ld sp,hl 535 | add hl,hl 536 | add hl,hl 537 | add hl,hl 538 | add hl,hl 539 | add hl,sp 540 | bit 2,a 541 | jr Z,$+3 542 | add hl,hl 543 | ld (tcx),l 544 | ld (tcx+1),h 545 | 546 | ;bx = x1 - x0 547 | ld hl,(x1) 548 | or a,a 549 | sbc hl,de 550 | ld d,h 551 | ld e,l 552 | add hl,hl 553 | add hl,hl 554 | add hl,hl 555 | add hl,hl 556 | add hl,de 557 | bit 2,a 558 | jr Z,$+3 559 | add hl,hl 560 | ld (tbx),l 561 | ld (tbx+1),h 562 | 563 | ; ax = x0 - x1 - x3 + x2 = x2 - bx - x1 564 | ld hl,(x2) 565 | or a,a 566 | sbc hl,de 567 | or a,a 568 | sbc hl,bc 569 | ld (tax),l 570 | ld (tax+1),h 571 | bit 2,a 572 | jr Z,$+4 573 | add hl,hl 574 | add hl,hl 575 | 576 | ;next face cache entry 577 | lea iy,iy+20 578 | ld (cachePointer),iy 579 | loadFacePointer: 580 | ld iy,(facePointer) 581 | skipFace: 582 | lea iy,iy+12 583 | exx 584 | or a,a 585 | sbc hl,de 586 | jq nz,faceloop 587 | ld sp,0 588 | StoreSP:=$-3 589 | pop ix 590 | ret 591 | 592 | 593 | 594 | ; iterates through face buckets and renders faces 595 | _qdDraw: 596 | ld a,$FF 597 | ld (_currentShader),a 598 | 599 | or a,a 600 | sbc hl,hl 601 | add hl,sp 602 | ld sp,$E30BFC 603 | push hl 604 | push ix 605 | ld ix,ixVars 606 | 607 | ld hl,(bucketMax) 608 | ld de,(bucketMin) 609 | or a,a 610 | sbc hl,de 611 | jq m,return 612 | push hl 613 | add hl,de 614 | ex de,hl 615 | ld ix,_qdFaceBucket 616 | add ix,de 617 | add ix,de 618 | 619 | ld hl,(ix+0) 620 | push ix-2 621 | .loop: 622 | bit 7,h 623 | jr z,.skip 624 | 625 | pop hl 626 | pop bc 627 | .emptyloop: 628 | dec bc 629 | bit 7,b 630 | jq nz,return 631 | ld de,(hl) 632 | dec hl 633 | dec hl 634 | bit 7,d 635 | jr nz,.emptyloop 636 | push bc 637 | push hl 638 | ex de,hl 639 | 640 | .skip: 641 | ; hl*20 642 | ld d,h 643 | ld e,l 644 | add hl,hl 645 | add hl,hl 646 | add hl,hl 647 | add hl,hl 648 | ex de,hl 649 | add hl,hl 650 | add hl,hl 651 | add hl,de 652 | ex.sis de,hl ; clears uDE 653 | 654 | ld iy,_qdFaceCache 655 | add iy,de 656 | ld hl,(iy+18) 657 | ld i,hl 658 | call _callShader 659 | ld hl,i 660 | jq .loop 661 | 662 | return: 663 | pop ix 664 | pop hl 665 | ld sp,hl 666 | jq _qdResetCache 667 | 668 | 669 | ;------------------------------------ 670 | ; hl = min(hl,de) (16 bit) 671 | minHLDE: 672 | or a,a 673 | sbc.sis hl,de 674 | jq c,$+4 675 | ex de,hl 676 | ret 677 | add hl,de 678 | ret 679 | 680 | ; correct offscreen UV coords 681 | correctU: 682 | ld (tx0),canvas_offset 683 | call correctUV 684 | ld de,(tustart) 685 | add hl,de 686 | ld (tustart),hl 687 | ret 688 | correctV: 689 | ld (ty0),0 690 | call correctUV 691 | ld de,(tvstart) 692 | add hl,de 693 | ld (tvstart),hl 694 | ret 695 | correctUV: 696 | ex de,hl 697 | or a,a 698 | sbc hl,hl 699 | sbc hl,de ; abs(hl) 700 | ex de,hl 701 | ld bc,(tdelta) 702 | ; fixed de*bc 703 | ld h,e 704 | ld l,c 705 | mlt hl 706 | ld a,b 707 | ld b,d 708 | ld d,a 709 | mlt de 710 | mlt bc 711 | ld a,h 712 | add a,c 713 | add a,e 714 | ld h,a 715 | ret 716 | 717 | 718 | extern _qdActiveSprite 719 | extern _qdNumSprites 720 | extern _qdActiveObject 721 | extern _qdNumObjects 722 | 723 | extern _qdCameraMatrix 724 | extern _setCameraPosition 725 | extern _projectVertices 726 | extern _projectSprites 727 | 728 | extern _qdVertexCache 729 | extern _qdFaceBucket 730 | extern _qdFaceCache 731 | extern _qdClearCanvas 732 | 733 | extern _currentShader 734 | extern _callShader 735 | 736 | extern canvas_width 737 | extern canvas_height 738 | extern canvas_offset 739 | -------------------------------------------------------------------------------- /src/quad/shader/flat.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | extern shaderVloop 4 | extern shaderVloopIncB 5 | extern canvas_height 6 | 7 | ;place at end of shader 8 | macro endShader shader 9 | shader.len:=$-shader 10 | assert shader.len <= 64 11 | end macro 12 | 13 | 14 | ;----------------------------------- 15 | flat16: 16 | ld a,h 17 | exx 18 | ld d,a 19 | ld e,h 20 | ld b,iyl 21 | ld a,b 22 | ld (de),a 23 | add hl,sp 24 | exx 25 | add hl,de 26 | repeat 3 27 | ld a,h 28 | exx 29 | ld d,a 30 | ld e,h 31 | ld a,b 32 | ld (de),a 33 | add hl,sp 34 | exx 35 | add hl,de 36 | end repeat 37 | djnz flat16 38 | ld b,4 39 | jp shaderVloop 40 | endShader flat16 41 | 42 | ;----------------------------------- 43 | flat16_clipped: 44 | ld a,h 45 | exx 46 | ld d,a 47 | cp a,canvas_height 48 | jr nc,$+7 49 | ld e,h 50 | ld b,iyl 51 | ld a,b 52 | ld (de),a 53 | add hl,sp 54 | exx 55 | add hl,de 56 | repeat 3 57 | ld a,h 58 | exx 59 | ld d,a 60 | cp a,canvas_height 61 | jr nc,$+5 62 | ld e,h 63 | ld a,b 64 | ld (de),a 65 | add hl,sp 66 | exx 67 | add hl,de 68 | end repeat 69 | djnz flat16_clipped 70 | ld b,4 71 | jp shaderVloop 72 | endShader flat16_clipped 73 | 74 | 75 | ;----------------------------------- 76 | flat32: 77 | repeat 2 78 | ld a,h 79 | exx 80 | ld d,a 81 | ld e,h 82 | ld a,iyl 83 | ld (de),a 84 | inc e 85 | ld (de),a 86 | inc d 87 | ld (de),a 88 | dec e 89 | ld (de),a 90 | add hl,sp 91 | exx 92 | add hl,de 93 | end repeat 94 | djnz flat32 95 | ld b,8 96 | jp shaderVloop 97 | endShader flat32 98 | 99 | ;----------------------------------- 100 | flat32_clipped: 101 | repeat 2 102 | ld a,h 103 | exx 104 | cp a,canvas_height-1 105 | jr nc,$+13 106 | ld d,a 107 | ld e,h 108 | ld a,iyl 109 | ld (de),a 110 | inc e 111 | ld (de),a 112 | inc d 113 | ld (de),a 114 | dec e 115 | ld (de),a 116 | add hl,sp 117 | exx 118 | add hl,de 119 | end repeat 120 | djnz flat32_clipped 121 | ld b,8 122 | jp shaderVloop 123 | endShader flat32_clipped 124 | 125 | ;----------------------------------- 126 | flat8: 127 | ld a,h 128 | exx 129 | ld d,a 130 | ld e,h 131 | ld b,iyl 132 | ld a,b 133 | ld (de),a 134 | add hl,sp 135 | exx 136 | add hl,de 137 | repeat 3 138 | ld a,h 139 | exx 140 | ld d,a 141 | ld e,h 142 | ld a,b 143 | ld (de),a 144 | add hl,sp 145 | exx 146 | add hl,de 147 | end repeat 148 | djnz flat8 149 | ld b,2 150 | jp shaderVloopIncB 151 | endShader flat8 152 | 153 | ;----------------------------------- 154 | flat8_clipped: 155 | ld a,h 156 | exx 157 | ld d,a 158 | cp a,canvas_height 159 | jr nc,$+7 160 | ld e,h 161 | ld b,iyl 162 | ld a,b 163 | ld (de),a 164 | add hl,sp 165 | exx 166 | add hl,de 167 | repeat 3 168 | ld a,h 169 | exx 170 | ld d,a 171 | cp a,canvas_height 172 | jr nc,$+5 173 | ld e,h 174 | ld a,b 175 | ld (de),a 176 | add hl,sp 177 | exx 178 | add hl,de 179 | end repeat 180 | djnz flat8_clipped 181 | ld b,2 182 | jp shaderVloopIncB 183 | endShader flat8_clipped 184 | 185 | public flat16 186 | public flat16.len 187 | public flat16_clipped 188 | public flat16_clipped.len 189 | public flat32 190 | public flat32.len 191 | public flat32_clipped 192 | public flat32_clipped.len 193 | public flat8 194 | public flat8.len 195 | public flat8_clipped 196 | public flat8_clipped.len -------------------------------------------------------------------------------- /src/quad/shader/shader.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | public _callShader 4 | public _shaderRoutine 5 | public _shaderRoutine_len 6 | public _shaderRoutine_src 7 | public _currentShader 8 | 9 | extern bilerp16 10 | extern bilerp16.len 11 | extern bilerp16_clipped 12 | extern bilerp16_clipped.len 13 | extern bilerp32 14 | extern bilerp32.len 15 | extern bilerp32_clipped 16 | extern bilerp32_clipped.len 17 | extern bilerp8 18 | extern bilerp8.len 19 | extern bilerp8_clipped 20 | extern bilerp8_clipped.len 21 | 22 | extern flat16 23 | extern flat16.len 24 | extern flat16_clipped 25 | extern flat16_clipped.len 26 | extern flat32 27 | extern flat32.len 28 | extern flat32_clipped 29 | extern flat32_clipped.len 30 | extern flat8 31 | extern flat8.len 32 | extern flat8_clipped 33 | extern flat8_clipped.len 34 | 35 | 36 | public shaderVloop 37 | public shaderVloopIncB 38 | 39 | extern canvas_height 40 | 41 | shaderUloop:=$E10010 ; $E10010 or $E30B00 depending on OS revision 42 | 43 | shader equ iy+0 44 | light equ iy+1 45 | u0 equ iy+2 46 | v0 equ iy+3 47 | x0 equ iy+4 48 | y0 equ iy+5 49 | ay equ iy+6 50 | ax equ iy+8 51 | by equ iy+10 52 | bx equ iy+12 53 | cy equ iy+14 54 | cx equ iy+16 55 | next equ iy+18 56 | 57 | xlen equ iy+2 58 | ylen equ iy+3 59 | ustart equ iy+6 60 | vstart equ iy+9 61 | delta equ iy+12 62 | 63 | ;shader macro definitions 64 | 65 | macro shaderEntry? shader,ppl ; shader = shader name , ppl = pixels per loop 66 | emit 3: shader 67 | db shader.len 68 | db ppl 69 | end macro 70 | 71 | ;place at end of shader 72 | macro endShader shader 73 | shader.len:=$-shader 74 | assert shader.len <= 64 75 | end macro 76 | 77 | ;----------------------------------------- 78 | ; Shader lookup table 79 | ; shader byte format: 80 | ; 0nnnnhdc 81 | ; n = shader type 82 | ; h = half size 83 | ; d = double pixels 84 | ; c = clipped/unclipped 85 | 86 | shaderTable: 87 | shaderEntry bilerp16,4 88 | shaderEntry bilerp16_clipped,8 89 | shaderEntry bilerp32,8 90 | shaderEntry bilerp32_clipped,8 91 | shaderEntry bilerp8,2 92 | shaderEntry bilerp8_clipped,4 93 | rb 10 94 | 95 | shaderEntry flat16,4 96 | shaderEntry flat16_clipped,4 97 | shaderEntry flat32,8 98 | shaderEntry flat32_clipped,8 99 | shaderEntry flat8,2 100 | shaderEntry flat8_clipped,2 101 | rb 10 102 | 103 | ;----------------------------------------- 104 | ; bc = texture 105 | ; de = canvas 106 | ; hl = u 107 | ; spl = delta 108 | ; b' = xlen / 2 109 | ; c' = ylen 110 | ; hl' = v 111 | ; ixh = x0 112 | ; ixl = xlen / 2 113 | ; iy = ustart 114 | ; Sprite Shader 115 | spriteRoutine: 116 | .yloop: 117 | exx 118 | ld b,a 119 | inc d 120 | ld e,ixh 121 | lea hl,iy+0 122 | exx 123 | .xloop: 124 | exx 125 | repeat 2 126 | ld c,h 127 | ld a,(bc) 128 | or a,a 129 | jr Z,$+3 130 | ld (de),a 131 | inc e 132 | add hl,sp 133 | end repeat 134 | exx 135 | djnz .xloop 136 | ld b,ixl 137 | add hl,sp 138 | ld a,h 139 | dec c 140 | jr nz,.yloop 141 | jp exitShader 142 | endShader spriteRoutine 143 | 144 | 145 | ;----------------------------------- 146 | ;input: 147 | ; iy = pointer to face 148 | ; i = next face in cache 149 | ; register state after below 150 | ; hl = y 151 | ; de = dy 152 | ; b = u counter 153 | ; c = v counter 154 | ; hl' = x 155 | ; de' = canvas pointer 156 | ; bc' = texture pointer 157 | ; spl = dx 158 | ; sps = yi 159 | ; ix = xi 160 | ; iyl = light 161 | ; iyh = u0 162 | _callShader: 163 | ; load shader to $E10010 164 | ld l,(shader) 165 | ld a,$FF 166 | _currentShader:=$-1 167 | bit 7,l ; sprite shader = $80+ 168 | jq nz,spriteShader 169 | sub a,l 170 | ld h,5 171 | mlt hl 172 | ld de,shaderTable 173 | add hl,de 174 | or a,a 175 | jr nz,loadShader ; skip shader if already loaded 176 | inc hl 177 | inc hl 178 | inc hl 179 | inc hl 180 | ld a,(hl) ; fetch ppl for shader again 181 | jr cont 182 | loadShader: 183 | ld de,(hl) 184 | inc hl 185 | inc hl 186 | inc hl 187 | ld bc,0 188 | ld c,(hl) 189 | inc hl 190 | ld a,(hl) 191 | ex de,hl 192 | ld de,shaderUloop 193 | ldir 194 | 195 | cont: 196 | ; load variables and SMC bytes 197 | ld (SMCloadSP),sp 198 | ld c,16 199 | 200 | ld b,a ; b = u count 201 | ld a,(shader) 202 | ld (_currentShader),a 203 | bit 2,a 204 | jr Z,$+4 205 | srl c 206 | 207 | ld ix,_shaderRoutine 208 | ld hl,(ax) 209 | ld (ix + SMCloadAX-_shaderRoutine),hl 210 | 211 | ld hl,(ay) 212 | ld (ix + SMCloadAY-_shaderRoutine),hl 213 | 214 | ld hl,(cx) 215 | ld (ix + SMCloadCX-_shaderRoutine),hl 216 | ld (ix + SMCloadCX+2-_shaderRoutine),$d4 217 | 218 | ld hl,(cy) 219 | ld (ix + SMCloadCY-_shaderRoutine),hl 220 | 221 | ld de,(by) ; de = dy 222 | 223 | ld h,(y0) ; sps = yi 224 | ld l,0 225 | ld.sis sp,hl 226 | exx 227 | 228 | ld de,$D40000 ;de' = screen ptr 229 | 230 | ld hl,(bx) ; spl = dx 231 | ld sp,hl 232 | 233 | ld a,(x0) ;ix = xi 234 | ld ixl,e 235 | ld ixh,a 236 | ld l,e ; hl' = x 237 | ld h,a 238 | 239 | ld bc,$D48000 ;bc' = texture ptr 240 | ld a,(v0) 241 | add a,b 242 | ld b,a 243 | ld a,(u0) 244 | ld c,a 245 | 246 | ld a,(light) 247 | ld iyl,a 248 | ld iyh,c 249 | 250 | dispatch: 251 | exx 252 | jp shaderUloop 253 | 254 | 255 | ; register state after the following: 256 | ; bc = texture 257 | ; de = canvas 258 | ; hl = u 259 | ; spl = delta 260 | ; b' = xlen / 2 261 | ; c' = ylen 262 | ; hl' = v 263 | ; ixh = x0 264 | ; ixl = xlen / 2 265 | ; iy = u0 266 | spriteShader: 267 | cp a,l 268 | jq Z,.skipLoad 269 | ld a,l 270 | ld (_currentShader),a 271 | ld hl,spriteRoutine 272 | ld de,shaderUloop 273 | ld bc,spriteRoutine.len 274 | ldir 275 | .skipLoad: 276 | ld (SMCloadSP),sp 277 | ld bc,$D40000 278 | ld de,$D40000 279 | ld d,(y0) 280 | dec d 281 | ld e,(x0) 282 | ld ixh,e 283 | ld hl,(delta) 284 | ld sp,hl 285 | exx 286 | ld de,(ustart) 287 | ld b,(xlen) 288 | srl b 289 | ld ixl,b 290 | ld c,(ylen) 291 | ld hl,(vstart) 292 | ld a,$80 293 | add a,h 294 | ld h,a 295 | ld iyl,e 296 | ld iyh,d 297 | jp shaderUloop 298 | 299 | ;------------------------------ 300 | 301 | virtual at $E30880 302 | _shaderRoutine: 303 | 304 | ; called after each line drawn to update deltas and counters for next line. 305 | ; xi += cx 306 | ; x = xi 307 | ; yi += cy 308 | ; y = yi 309 | ; dy += ay 310 | ; dx += ax 311 | shaderVloopIncB: 312 | exx 313 | inc b 314 | exx 315 | 316 | shaderVloop: 317 | dec c 318 | jr nz,skipExit 319 | exitShader: 320 | ld sp,0 321 | SMCloadSP:=$-3 322 | ret 323 | 324 | skipExit: 325 | ld hl,0 326 | SMCloadAY:=$-3 327 | add hl,de 328 | ex de,hl 329 | ld hl,0 330 | SMCloadAX:=$-3 331 | add hl,sp 332 | ld sp,hl 333 | ld hl,0 334 | SMCloadCY:=$-3 335 | add.sis hl,sp 336 | ld.sis sp,hl 337 | exx 338 | ld de,0 339 | SMCloadCX:=$-3 340 | add ix,de 341 | lea hl,ix+0 342 | inc b ; v++ 343 | ld c,iyh 344 | exx 345 | jp shaderUloop 346 | 347 | assert $ < $E308E0 348 | load _shaderRoutine_data: $-$$ from $$ 349 | _shaderRoutine_len := $-$$ 350 | end virtual 351 | _shaderRoutine_src: 352 | db _shaderRoutine_data 353 | -------------------------------------------------------------------------------- /src/quad/shader/textured.asm: -------------------------------------------------------------------------------- 1 | section .text 2 | 3 | extern shaderVloop 4 | extern shaderVloopIncB 5 | extern canvas_height 6 | 7 | ;place at end of shader 8 | macro endShader shader 9 | shader.len:=$-shader 10 | assert shader.len <= 64 11 | end macro 12 | 13 | 14 | 15 | ;----------------------------------- 16 | bilerp16: 17 | repeat 4 18 | ld a,h 19 | exx 20 | ld d,a 21 | ld e,h 22 | ld a,(bc) 23 | ld (de),a 24 | inc c 25 | add hl,sp 26 | exx 27 | add hl,de 28 | end repeat 29 | djnz bilerp16 30 | ld b,4 31 | jp shaderVloop 32 | endShader bilerp16 33 | 34 | ;----------------------------------- 35 | bilerp16_clipped: 36 | repeat 2 37 | ld a,h 38 | exx 39 | ld d,a 40 | cp a,canvas_height 41 | jr nc,$+7 42 | ld e,h 43 | ld a,(bc) 44 | ld (de),a 45 | inc c 46 | add hl,sp 47 | exx 48 | add hl,de 49 | end repeat 50 | djnz bilerp16_clipped 51 | ld b,8 52 | jp shaderVloop 53 | endShader bilerp16_clipped 54 | 55 | ;----------------------------------- 56 | bilerp32: 57 | repeat 2 58 | ld a,h 59 | exx 60 | ld d,a 61 | ld e,h 62 | ld a,(bc) 63 | ld (de),a 64 | inc e 65 | ld (de),a 66 | inc d 67 | ld (de),a 68 | dec e 69 | ld (de),a 70 | inc c 71 | add hl,sp 72 | exx 73 | add hl,de 74 | end repeat 75 | djnz bilerp32 76 | ld b,8 77 | jp shaderVloop 78 | endShader bilerp32 79 | 80 | ;----------------------------------- 81 | bilerp32_clipped: 82 | repeat 2 83 | ld a,h 84 | exx 85 | cp a,canvas_height-1 86 | jr nc,$+14 87 | ld d,a 88 | ld e,h 89 | ld a,(bc) 90 | ld (de),a 91 | inc e 92 | ld (de),a 93 | inc d 94 | ld (de),a 95 | dec e 96 | ld (de),a 97 | inc c 98 | add hl,sp 99 | exx 100 | add hl,de 101 | end repeat 102 | djnz bilerp32_clipped 103 | ld b,8 104 | jp shaderVloop 105 | endShader bilerp32_clipped 106 | 107 | ;----------------------------------- 108 | bilerp8: 109 | repeat 4 110 | ld a,h 111 | exx 112 | ld d,a 113 | ld e,h 114 | ld a,(bc) 115 | ld (de),a 116 | inc c 117 | inc c 118 | add hl,sp 119 | exx 120 | add hl,de 121 | end repeat 122 | djnz bilerp8 123 | ld b,2 124 | jp shaderVloopIncB 125 | endShader bilerp8 126 | 127 | ;----------------------------------- 128 | bilerp8_clipped: 129 | repeat 2 130 | ld a,h 131 | exx 132 | ld d,a 133 | cp a,canvas_height 134 | jr nc,$+7 135 | ld e,h 136 | ld a,(bc) 137 | ld (de),a 138 | inc c 139 | inc c 140 | add hl,sp 141 | exx 142 | add hl,de 143 | end repeat 144 | djnz bilerp8_clipped 145 | ld b,4 146 | jp shaderVloopIncB 147 | endShader bilerp8_clipped 148 | 149 | 150 | 151 | public bilerp16 152 | public bilerp16.len 153 | public bilerp16_clipped 154 | public bilerp16_clipped.len 155 | public bilerp32 156 | public bilerp32.len 157 | public bilerp32_clipped 158 | public bilerp32_clipped.len 159 | public bilerp8 160 | public bilerp8.len 161 | public bilerp8_clipped 162 | public bilerp8_clipped.len -------------------------------------------------------------------------------- /src/zelda.c: -------------------------------------------------------------------------------- 1 | //Model from zelda.obj 2 | #include "quad/quad.h" 3 | 4 | static qdVertex verts[546]; 5 | static qdFace faces[254]; 6 | qdObject zelda = {0,0,0,546,254,verts,faces,0,0}; 7 | 8 | static qdFace faces[254] = { 9 | {SHADER_TEXTURED,0xFF,0,0,0,1,2,3}, 10 | {SHADER_TEXTURED,0xFF,0,0,4,5,6,6}, 11 | {SHADER_TEXTURED,0xFF,0,0,5,7,6,6}, 12 | {SHADER_TEXTURED,0xFF,0,0,6,7,8,8}, 13 | {SHADER_TEXTURED,0xFF,0,0,7,9,8,8}, 14 | {SHADER_TEXTURED,0xFF,0,0,8,9,10,10}, 15 | {SHADER_TEXTURED,0xFF,0,0,9,11,10,10}, 16 | {SHADER_TEXTURED,0xFF,0,0,10,11,12,12}, 17 | {SHADER_TEXTURED,0xFF,0,0,13,14,15,16}, 18 | {SHADER_TEXTURED,0xFF,0,0,17,18,19,19}, 19 | {SHADER_TEXTURED,0xFF,0,0,20,21,22,23}, 20 | {SHADER_TEXTURED,0xFF,0,0,24,25,26,26}, 21 | {SHADER_TEXTURED,0xFF,0,0,25,27,26,26}, 22 | {SHADER_TEXTURED,0xFF,0,0,28,29,30,30}, 23 | {SHADER_TEXTURED,0xFF,0,0,31,32,33,34}, 24 | {SHADER_TEXTURED,0xFF,0,0,35,36,37,38}, 25 | {SHADER_TEXTURED,0xFF,0,0,39,40,30,29}, 26 | {SHADER_TEXTURED,0xFF,0,0,41,42,43,43}, 27 | {SHADER_TEXTURED,0xFF,0,0,44,45,46,46}, 28 | {SHADER_TEXTURED,0xFF,0,0,45,47,46,46}, 29 | {SHADER_TEXTURED,0xFF,0,0,46,47,48,48}, 30 | {SHADER_TEXTURED,0xFF,0,0,49,50,51,52}, 31 | {SHADER_TEXTURED,0xFF,0,0,53,54,55,55}, 32 | {SHADER_TEXTURED,0xFF,0,0,55,54,56,56}, 33 | {SHADER_TEXTURED,0xFF,0,0,57,58,59,59}, 34 | {SHADER_TEXTURED,0xFF,0,0,58,60,59,59}, 35 | {SHADER_TEXTURED,0xFF,0,0,61,62,63,64}, 36 | {SHADER_TEXTURED,0xFF,0,0,65,66,67,67}, 37 | {SHADER_TEXTURED,0xFF,0,0,66,68,67,67}, 38 | {SHADER_TEXTURED,0xFF,0,0,69,70,71,71}, 39 | {SHADER_TEXTURED,0xFF,0,0,70,72,71,71}, 40 | {SHADER_TEXTURED,0xFF,0,0,71,72,73,73}, 41 | {SHADER_TEXTURED,0xFF,0,0,74,75,76,77}, 42 | {SHADER_TEXTURED,0xFF,0,0,78,79,80,80}, 43 | {SHADER_TEXTURED,0xFF,0,0,81,82,83,83}, 44 | {SHADER_TEXTURED,0xFF,0,0,82,84,83,83}, 45 | {SHADER_TEXTURED,0xFF,0,0,83,84,85,85}, 46 | {SHADER_TEXTURED,0xFF,0,0,84,86,85,85}, 47 | {SHADER_TEXTURED,0xFF,0,0,85,86,87,87}, 48 | {SHADER_TEXTURED,0xFF,0,0,88,89,90,90}, 49 | {SHADER_TEXTURED,0xFF,0,0,91,92,93,94}, 50 | {SHADER_TEXTURED,0xFF,0,0,95,96,97,98}, 51 | {SHADER_TEXTURED,0xFF,0,0,99,100,101,101}, 52 | {SHADER_TEXTURED,0xFF,0,0,100,102,101,101}, 53 | {SHADER_TEXTURED,0xFF,0,0,101,102,103,103}, 54 | {SHADER_TEXTURED,0xFF,0,0,102,104,103,103}, 55 | {SHADER_TEXTURED,0xFF,0,0,103,104,105,105}, 56 | {SHADER_TEXTURED,0xFF,0,0,106,107,108,108}, 57 | {SHADER_TEXTURED,0xFF,0,0,107,109,108,108}, 58 | {SHADER_TEXTURED,0xFF,0,0,78,80,73,72}, 59 | {SHADER_TEXTURED,0xFF,0,0,110,111,112,112}, 60 | {SHADER_TEXTURED,0xFF,0,0,113,114,115,115}, 61 | {SHADER_TEXTURED,0xFF,0,0,116,5,4,117}, 62 | {SHADER_TEXTURED,0xFF,0,0,118,119,120,120}, 63 | {SHADER_TEXTURED,0xFF,0,0,120,119,121,121}, 64 | {SHADER_TEXTURED,0xFF,0,0,122,123,124,125}, 65 | {SHADER_TEXTURED,0xFF,0,0,126,127,128,129}, 66 | {SHADER_TEXTURED,0xFF,0,0,130,131,132,132}, 67 | {SHADER_TEXTURED,0xFF,0,0,133,134,135,136}, 68 | {SHADER_TEXTURED,0xFF,0,0,137,138,139,139}, 69 | {SHADER_TEXTURED,0xFF,0,0,140,141,142,142}, 70 | {SHADER_TEXTURED,0xFF,0,0,143,144,145,146}, 71 | {SHADER_TEXTURED,0xFF,0,0,147,148,149,149}, 72 | {SHADER_TEXTURED,0xFF,0,0,150,98,97,97}, 73 | {SHADER_TEXTURED,0xFF,0,0,151,152,153,154}, 74 | {SHADER_TEXTURED,0xFF,0,0,95,155,96,96}, 75 | {SHADER_TEXTURED,0xFF,0,0,156,157,158,159}, 76 | {SHADER_TEXTURED,0xFF,0,0,145,144,160,160}, 77 | {SHADER_TEXTURED,0xFF,0,0,144,161,160,160}, 78 | {SHADER_TEXTURED,0xFF,0,0,162,163,164,164}, 79 | {SHADER_TEXTURED,0xFF,0,0,163,165,164,164}, 80 | {SHADER_TEXTURED,0xFF,0,0,164,165,166,166}, 81 | {SHADER_TEXTURED,0xFF,0,0,165,167,166,166}, 82 | {SHADER_TEXTURED,0xFF,0,0,168,169,170,171}, 83 | {SHADER_TEXTURED,0xFF,0,0,172,173,40,39}, 84 | {SHADER_TEXTURED,0xFF,0,0,174,52,51,51}, 85 | {SHADER_TEXTURED,0xFF,0,0,147,149,142,141}, 86 | {SHADER_TEXTURED,0xFF,0,0,49,175,50,50}, 87 | {SHADER_TEXTURED,0xFF,0,0,176,177,178,178}, 88 | {SHADER_TEXTURED,0xFF,0,0,177,179,178,178}, 89 | {SHADER_TEXTURED,0xFF,0,0,178,179,180,180}, 90 | {SHADER_TEXTURED,0xFF,0,0,179,181,180,180}, 91 | {SHADER_TEXTURED,0xFF,0,0,182,183,184,184}, 92 | {SHADER_TEXTURED,0xFF,0,0,185,186,187,188}, 93 | {SHADER_TEXTURED,0xFF,0,0,189,190,191,191}, 94 | {SHADER_TEXTURED,0xFF,0,0,188,187,90,89}, 95 | {SHADER_TEXTURED,0xFF,0,0,189,191,184,183}, 96 | {SHADER_TEXTURED,0xFF,0,0,192,3,2,2}, 97 | {SHADER_TEXTURED,0xFF,0,0,17,19,12,11}, 98 | {SHADER_TEXTURED,0xFF,0,0,0,193,1,1}, 99 | {SHADER_TEXTURED,0xFF,0,0,194,171,170,170}, 100 | {SHADER_TEXTURED,0xFF,0,0,109,111,110,108}, 101 | {SHADER_TEXTURED,0xFF,0,0,168,195,169,169}, 102 | {SHADER_TEXTURED,0xFF,0,0,196,197,198,198}, 103 | {SHADER_TEXTURED,0xFF,0,0,197,199,198,198}, 104 | {SHADER_TEXTURED,0xFF,0,0,198,199,200,200}, 105 | {SHADER_TEXTURED,0xFF,0,0,199,201,200,200}, 106 | {SHADER_TEXTURED,0xFF,0,0,202,203,204,204}, 107 | {SHADER_TEXTURED,0xFF,0,0,203,205,204,204}, 108 | {SHADER_TEXTURED,0xFF,0,0,204,205,206,206}, 109 | {SHADER_TEXTURED,0xFF,0,0,205,207,206,206}, 110 | {SHADER_TEXTURED,0xFF,0,0,208,209,210,211}, 111 | {SHADER_TEXTURED,0xFF,0,0,212,213,214,215}, 112 | {SHADER_TEXTURED,0xFF,0,0,216,154,153,153}, 113 | {SHADER_TEXTURED,0xFF,0,0,118,120,115,114}, 114 | {SHADER_TEXTURED,0xFF,0,0,151,217,152,152}, 115 | {SHADER_TEXTURED,0xFF,0,0,218,219,220,220}, 116 | {SHADER_TEXTURED,0xFF,0,0,219,221,220,220}, 117 | {SHADER_TEXTURED,0xFF,0,0,220,221,222,222}, 118 | {SHADER_TEXTURED,0xFF,0,0,223,224,225,225}, 119 | {SHADER_TEXTURED,0xFF,0,0,224,226,225,225}, 120 | {SHADER_TEXTURED,0xFF,0,0,225,226,227,227}, 121 | {SHADER_TEXTURED,0xFF,0,0,228,229,230,230}, 122 | {SHADER_TEXTURED,0xFF,0,0,229,231,230,230}, 123 | {SHADER_TEXTURED,0xFF,0,0,230,231,232,232}, 124 | {SHADER_TEXTURED,0xFF,0,0,214,213,233,233}, 125 | {SHADER_TEXTURED,0xFF,0,0,234,235,236,236}, 126 | {SHADER_TEXTURED,0xFF,0,0,41,43,173,172}, 127 | {SHADER_TEXTURED,0xFF,0,0,53,55,48,47}, 128 | {SHADER_TEXTURED,0xFF,0,0,22,21,237,237}, 129 | {SHADER_TEXTURED,0xFF,0,0,238,239,240,240}, 130 | {SHADER_TEXTURED,0xFF,0,0,239,241,240,240}, 131 | {SHADER_TEXTURED,0xFF,0,0,240,241,242,242}, 132 | {SHADER_TEXTURED,0xFF,0,0,243,244,245,245}, 133 | {SHADER_TEXTURED,0xFF,0,0,244,246,245,245}, 134 | {SHADER_TEXTURED,0xFF,0,0,245,246,247,247}, 135 | {SHADER_TEXTURED,0xFF,0,0,248,249,250,251}, 136 | {SHADER_TEXTURED,0xFF,0,0,124,123,252,252}, 137 | {SHADER_TEXTURED,0xFF,0,0,253,254,255,255}, 138 | {SHADER_TEXTURED,0xFF,0,0,254,256,255,255}, 139 | {SHADER_TEXTURED,0xFF,0,0,255,256,257,257}, 140 | {SHADER_TEXTURED,0xFF,0,0,258,259,260,260}, 141 | {SHADER_TEXTURED,0xFF,0,0,259,261,260,260}, 142 | {SHADER_TEXTURED,0xFF,0,0,260,261,262,262}, 143 | {SHADER_TEXTURED,0xFF,0,0,263,264,265,265}, 144 | {SHADER_TEXTURED,0xFF,0,0,264,266,265,265}, 145 | {SHADER_TEXTURED,0xFF,0,0,265,266,267,267}, 146 | {SHADER_TEXTURED,0xFF,0,0,137,139,132,131}, 147 | {SHADER_TEXTURED,0xFF,0,0,63,62,268,268}, 148 | {SHADER_TEXTURED,0xFF,0,0,269,270,271,271}, 149 | {SHADER_TEXTURED,0xFF,0,0,272,273,274,275}, 150 | {SHADER_TEXTURED,0xFF,0,0,276,277,278,278}, 151 | {SHADER_TEXTURED,0xFF,0,0,277,279,278,278}, 152 | {SHADER_TEXTURED,0xFF,0,0,278,279,280,280}, 153 | {SHADER_TEXTURED,0xFF,0,0,281,282,283,283}, 154 | {SHADER_TEXTURED,0xFF,0,0,282,284,283,283}, 155 | {SHADER_TEXTURED,0xFF,0,0,283,284,285,285}, 156 | {SHADER_TEXTURED,0xFF,0,0,286,287,288,289}, 157 | {SHADER_TEXTURED,0xFF,0,0,76,75,290,290}, 158 | {SHADER_TEXTURED,0xFF,0,0,291,292,271,270}, 159 | {SHADER_TEXTURED,0xFF,0,0,293,294,295,295}, 160 | {SHADER_TEXTURED,0xFF,0,0,296,297,298,298}, 161 | {SHADER_TEXTURED,0xFF,0,0,297,299,298,298}, 162 | {SHADER_TEXTURED,0xFF,0,0,300,301,302,302}, 163 | {SHADER_TEXTURED,0xFF,0,0,301,303,302,302}, 164 | {SHADER_TEXTURED,0xFF,0,0,304,305,306,306}, 165 | {SHADER_TEXTURED,0xFF,0,0,305,307,306,306}, 166 | {SHADER_TEXTURED,0xFF,0,0,308,309,310,310}, 167 | {SHADER_TEXTURED,0xFF,0,0,309,311,310,310}, 168 | {SHADER_TEXTURED,0xFF,0,0,312,313,314,314}, 169 | {SHADER_TEXTURED,0xFF,0,0,313,315,314,314}, 170 | {SHADER_TEXTURED,0xFF,0,0,316,317,318,318}, 171 | {SHADER_TEXTURED,0xFF,0,0,317,319,318,318}, 172 | {SHADER_TEXTURED,0xFF,0,0,320,321,322,322}, 173 | {SHADER_TEXTURED,0xFF,0,0,321,323,322,322}, 174 | {SHADER_TEXTURED,0xFF,0,0,324,325,326,326}, 175 | {SHADER_TEXTURED,0xFF,0,0,325,327,326,326}, 176 | {SHADER_TEXTURED,0xFF,0,0,328,329,330,330}, 177 | {SHADER_TEXTURED,0xFF,0,0,329,331,330,330}, 178 | {SHADER_TEXTURED,0xFF,0,0,332,333,334,334}, 179 | {SHADER_TEXTURED,0xFF,0,0,333,335,334,334}, 180 | {SHADER_TEXTURED,0xFF,0,0,336,337,338,338}, 181 | {SHADER_TEXTURED,0xFF,0,0,337,339,338,338}, 182 | {SHADER_TEXTURED,0xFF,0,0,340,341,342,342}, 183 | {SHADER_TEXTURED,0xFF,0,0,341,343,342,342}, 184 | {SHADER_TEXTURED,0xFF,0,0,344,345,346,346}, 185 | {SHADER_TEXTURED,0xFF,0,0,345,347,346,346}, 186 | {SHADER_TEXTURED,0xFF,0,0,348,349,350,350}, 187 | {SHADER_TEXTURED,0xFF,0,0,349,351,350,350}, 188 | {SHADER_TEXTURED,0xFF,0,0,352,353,354,355}, 189 | {SHADER_TEXTURED,0xFF,0,0,356,357,358,358}, 190 | {SHADER_TEXTURED,0xFF,0,0,357,359,358,358}, 191 | {SHADER_TEXTURED,0xFF,0,0,360,361,362,362}, 192 | {SHADER_TEXTURED,0xFF,0,0,361,363,362,362}, 193 | {SHADER_TEXTURED,0xFF,0,0,364,133,136,365}, 194 | {SHADER_TEXTURED,0xFF,0,0,366,367,368,368}, 195 | {SHADER_TEXTURED,0xFF,0,0,367,369,368,368}, 196 | {SHADER_TEXTURED,0xFF,0,0,370,371,372,372}, 197 | {SHADER_TEXTURED,0xFF,0,0,371,373,372,372}, 198 | {SHADER_TEXTURED,0xFF,0,0,18,25,24,19}, 199 | {SHADER_TEXTURED,0xFF,0,0,374,375,376,376}, 200 | {SHADER_TEXTURED,0xFF,0,0,375,377,376,376}, 201 | {SHADER_TEXTURED,0xFF,0,0,378,379,380,380}, 202 | {SHADER_TEXTURED,0xFF,0,0,379,381,380,380}, 203 | {SHADER_TEXTURED,0xFF,0,0,382,383,384,384}, 204 | {SHADER_TEXTURED,0xFF,0,0,383,385,384,384}, 205 | {SHADER_TEXTURED,0xFF,0,0,386,294,293,387}, 206 | {SHADER_TEXTURED,0xFF,0,0,388,389,390,390}, 207 | {SHADER_TEXTURED,0xFF,0,0,389,391,390,390}, 208 | {SHADER_TEXTURED,0xFF,0,0,392,393,394,394}, 209 | {SHADER_TEXTURED,0xFF,0,0,393,395,394,394}, 210 | {SHADER_TEXTURED,0xFF,0,0,396,397,236,235}, 211 | {SHADER_TEXTURED,0xFF,0,0,398,399,400,401}, 212 | {SHADER_TEXTURED,0xFF,0,0,402,403,404,405}, 213 | {SHADER_TEXTURED,0xFF,0,0,403,406,407,404}, 214 | {SHADER_TEXTURED,0xFF,0,0,408,409,410,410}, 215 | {SHADER_TEXTURED,0xFF,0,0,409,411,410,410}, 216 | {SHADER_TEXTURED,0xFF,0,0,412,35,38,413}, 217 | {SHADER_TEXTURED,0xFF,0,0,414,415,416,416}, 218 | {SHADER_TEXTURED,0xFF,0,0,415,417,416,416}, 219 | {SHADER_TEXTURED,0xFF,0,0,418,208,211,419}, 220 | {SHADER_TEXTURED,0xFF,0,0,420,421,422,422}, 221 | {SHADER_TEXTURED,0xFF,0,0,421,423,422,422}, 222 | {SHADER_TEXTURED,0xFF,0,0,424,425,426,426}, 223 | {SHADER_TEXTURED,0xFF,0,0,425,427,426,426}, 224 | {SHADER_TEXTURED,0xFF,0,0,428,429,430,431}, 225 | {SHADER_TEXTURED,0xFF,0,0,60,66,65,59}, 226 | {SHADER_TEXTURED,0xFF,0,0,432,433,434,435}, 227 | {SHADER_TEXTURED,0xFF,0,0,436,437,438,439}, 228 | {SHADER_TEXTURED,0xFF,0,0,440,441,442,442}, 229 | {SHADER_TEXTURED,0xFF,0,0,443,444,445,445}, 230 | {SHADER_TEXTURED,0xFF,0,0,446,447,448,448}, 231 | {SHADER_TEXTURED,0xFF,0,0,449,450,451,451}, 232 | {SHADER_TEXTURED,0xFF,0,0,452,453,454,454}, 233 | {SHADER_TEXTURED,0xFF,0,0,455,456,457,457}, 234 | {SHADER_TEXTURED,0xFF,0,0,458,459,460,460}, 235 | {SHADER_TEXTURED,0xFF,0,0,461,462,463,463}, 236 | {SHADER_TEXTURED,0xFF,0,0,464,465,466,466}, 237 | {SHADER_TEXTURED,0xFF,0,0,467,468,469,469}, 238 | {SHADER_TEXTURED,0xFF,0,0,470,471,472,472}, 239 | {SHADER_TEXTURED,0xFF,0,0,473,474,475,475}, 240 | {SHADER_TEXTURED,0xFF,0,0,476,477,478,478}, 241 | {SHADER_TEXTURED,0xFF,0,0,479,480,481,481}, 242 | {SHADER_TEXTURED,0xFF,0,0,482,483,484,484}, 243 | {SHADER_TEXTURED,0xFF,0,0,485,486,487,487}, 244 | {SHADER_TEXTURED,0xFF,0,0,488,489,490,490}, 245 | {SHADER_TEXTURED,0xFF,0,0,491,492,493,493}, 246 | {SHADER_TEXTURED,0xFF,0,0,494,495,496,496}, 247 | {SHADER_TEXTURED,0xFF,0,0,497,498,499,499}, 248 | {SHADER_TEXTURED,0xFF,0,0,500,501,502,502}, 249 | {SHADER_TEXTURED,0xFF,0,0,503,504,505,505}, 250 | {SHADER_TEXTURED,0xFF,0,0,506,507,508,508}, 251 | {SHADER_TEXTURED,0xFF,0,0,509,510,511,511}, 252 | {SHADER_TEXTURED,0xFF,0,0,512,513,514,514}, 253 | {SHADER_TEXTURED,0xFF,0,0,515,516,517,517}, 254 | {SHADER_TEXTURED,0xFF,0,0,518,519,520,520}, 255 | {SHADER_TEXTURED,0xFF,0,0,521,522,523,523}, 256 | {SHADER_TEXTURED,0xFF,0,0,524,525,526,526}, 257 | {SHADER_TEXTURED,0xFF,0,0,527,528,529,529}, 258 | {SHADER_TEXTURED,0xFF,0,0,530,531,532,532}, 259 | {SHADER_TEXTURED,0xFF,0,0,533,534,535,535}, 260 | {SHADER_TEXTURED,0xFF,0,0,536,537,538,538}, 261 | {SHADER_TEXTURED,0xFF,0,0,539,540,541,541}, 262 | {SHADER_TEXTURED,0xFF,0,0,542,543,544,545} 263 | }; 264 | static qdVertex verts[546] = { 265 | {128,156,133}, 266 | {128,151,134}, 267 | {132,152,132}, 268 | {131,156,131}, 269 | {128,149,122}, 270 | {134,149,123}, 271 | {134,145,123}, 272 | {139,149,124}, 273 | {141,149,130}, 274 | {134,152,129}, 275 | {135,150,132}, 276 | {128,150,134}, 277 | {128,146,135}, 278 | {123,128,128}, 279 | {125,128,126}, 280 | {126,128,128}, 281 | {125,128,131}, 282 | {121,150,132}, 283 | {115,149,130}, 284 | {121,145,132}, 285 | {122,145,123}, 286 | {124,142,124}, 287 | {122,142,131}, 288 | {121,145,132}, 289 | {122,145,123}, 290 | {117,149,124}, 291 | {122,149,123}, 292 | {123,152,125}, 293 | {154,145,120}, 294 | {155,147,134}, 295 | {154,145,136}, 296 | {133,139,130}, 297 | {133,137,131}, 298 | {133,137,124}, 299 | {132,139,125}, 300 | {106,147,127}, 301 | {106,150,126}, 302 | {108,149,126}, 303 | {108,148,128}, 304 | {149,154,134}, 305 | {146,154,136}, 306 | {155,147,122}, 307 | {155,147,134}, 308 | {154,145,120}, 309 | {124,139,125}, 310 | {128,142,124}, 311 | {132,139,125}, 312 | {132,142,124}, 313 | {134,142,131}, 314 | {148,151,128}, 315 | {142,152,128}, 316 | {145,149,130}, 317 | {148,149,129}, 318 | {134,145,123}, 319 | {141,149,130}, 320 | {135,145,132}, 321 | {135,150,132}, 322 | {124,164,127}, 323 | {123,161,127}, 324 | {123,164,126}, 325 | {120,159,125}, 326 | {142,152,128}, 327 | {142,149,125}, 328 | {137,149,124}, 329 | {137,152,128}, 330 | {123,164,128}, 331 | {120,159,129}, 332 | {123,161,127}, 333 | {125,159,127}, 334 | {135,135,128}, 335 | {132,137,132}, 336 | {131,133,130}, 337 | {129,135,128}, 338 | {130,132,128}, 339 | {125,156,131}, 340 | {128,156,133}, 341 | {128,159,131}, 342 | {125,160,128}, 343 | {131,134,126}, 344 | {133,132,128}, 345 | {131,131,126}, 346 | {119,149,124}, 347 | {119,146,128}, 348 | {114,147,128}, 349 | {119,149,130}, 350 | {116,149,130}, 351 | {114,152,128}, 352 | {111,149,130}, 353 | {135,150,132}, 354 | {128,146,135}, 355 | {135,145,132}, 356 | {117,149,124}, 357 | {115,149,130}, 358 | {122,152,129}, 359 | {123,152,125}, 360 | {131,131,126}, 361 | {131,128,126}, 362 | {130,128,128}, 363 | {130,132,128}, 364 | {133,161,127}, 365 | {132,164,127}, 366 | {133,164,126}, 367 | {134,168,127}, 368 | {133,164,128}, 369 | {132,164,127}, 370 | {133,161,127}, 371 | {124,137,132}, 372 | {125,133,130}, 373 | {127,135,128}, 374 | {126,132,128}, 375 | {125,134,126}, 376 | {125,131,126}, 377 | {123,132,128}, 378 | {122,145,123}, 379 | {122,149,123}, 380 | {128,149,122}, 381 | {133,152,125}, 382 | {128,153,124}, 383 | {123,152,125}, 384 | {128,158,127}, 385 | {128,153,124}, 386 | {133,152,125}, 387 | {148,148,128}, 388 | {150,147,127}, 389 | {150,148,130}, 390 | {148,149,129}, 391 | {148,149,126}, 392 | {150,150,126}, 393 | {150,147,127}, 394 | {148,148,128}, 395 | {119,149,130}, 396 | {119,152,128}, 397 | {114,152,128}, 398 | {122,142,131}, 399 | {123,139,130}, 400 | {128,140,133}, 401 | {128,142,134}, 402 | {119,149,124}, 403 | {114,147,128}, 404 | {114,149,125}, 405 | {113,149,125}, 406 | {114,147,128}, 407 | {108,148,128}, 408 | {134,145,123}, 409 | {128,142,124}, 410 | {122,145,123}, 411 | {128,149,122}, 412 | {111,149,130}, 413 | {108,151,128}, 414 | {108,149,129}, 415 | {131,131,130}, 416 | {125,131,126}, 417 | {125,128,126}, 418 | {123,128,128}, 419 | {123,132,128}, 420 | {133,128,128}, 421 | {128,134,132}, 422 | {123,137,131}, 423 | {123,137,124}, 424 | {128,137,123}, 425 | {124,142,124}, 426 | {124,139,125}, 427 | {137,152,128}, 428 | {137,149,130}, 429 | {142,152,128}, 430 | {140,149,130}, 431 | {145,149,130}, 432 | {142,147,128}, 433 | {126,128,128}, 434 | {126,132,128}, 435 | {125,131,130}, 436 | {125,129,129}, 437 | {149,154,122}, 438 | {146,154,120}, 439 | {148,148,128}, 440 | {143,149,125}, 441 | {129,135,128}, 442 | {131,136,125}, 443 | {131,134,126}, 444 | {135,135,128}, 445 | {133,132,128}, 446 | {131,133,130}, 447 | {148,151,128}, 448 | {148,149,126}, 449 | {143,149,125}, 450 | {128,140,133}, 451 | {133,139,130}, 452 | {134,142,131}, 453 | {128,142,134}, 454 | {148,148,128}, 455 | {145,149,130}, 456 | {142,147,128}, 457 | {133,153,128}, 458 | {124,152,132}, 459 | {123,128,128}, 460 | {125,131,126}, 461 | {134,152,129}, 462 | {128,158,127}, 463 | {128,150,134}, 464 | {122,152,129}, 465 | {121,150,132}, 466 | {115,149,130}, 467 | {123,161,127}, 468 | {124,164,127}, 469 | {123,164,128}, 470 | {122,168,127}, 471 | {123,164,126}, 472 | {124,164,127}, 473 | {106,151,129}, 474 | {106,148,130}, 475 | {108,149,129}, 476 | {108,151,128}, 477 | {148,149,129}, 478 | {150,148,130}, 479 | {150,151,129}, 480 | {148,151,128}, 481 | {125,131,130}, 482 | {126,128,128}, 483 | {123,137,124}, 484 | {124,139,125}, 485 | {128,137,123}, 486 | {132,139,125}, 487 | {133,137,124}, 488 | {131,156,128}, 489 | {136,159,125}, 490 | {136,159,129}, 491 | {133,164,128}, 492 | {133,161,127}, 493 | {131,159,127}, 494 | {133,161,127}, 495 | {136,159,125}, 496 | {133,164,126}, 497 | {133,164,128}, 498 | {152,149,128}, 499 | {123,153,128}, 500 | {123,156,128}, 501 | {125,152,121}, 502 | {124,139,125}, 503 | {106,148,130}, 504 | {106,151,129}, 505 | {104,149,128}, 506 | {106,150,126}, 507 | {106,147,127}, 508 | {131,160,128}, 509 | {128,160,124}, 510 | {128,162,128}, 511 | {125,160,128}, 512 | {128,159,131}, 513 | {148,151,128}, 514 | {150,151,129}, 515 | {150,150,126}, 516 | {148,149,126}, 517 | {152,149,128}, 518 | {137,152,128}, 519 | {137,149,124}, 520 | {133,149,128}, 521 | {137,146,128}, 522 | {137,149,130}, 523 | {119,149,124}, 524 | {119,152,128}, 525 | {123,149,128}, 526 | {119,149,130}, 527 | {119,146,128}, 528 | {127,135,128}, 529 | {125,136,125}, 530 | {125,139,128}, 531 | {121,135,128}, 532 | {124,137,132}, 533 | {142,147,128}, 534 | {133,153,128}, 535 | {133,156,128}, 536 | {131,156,131}, 537 | {128,140,133}, 538 | {128,134,132}, 539 | {133,137,131}, 540 | {133,139,130}, 541 | {140,149,130}, 542 | {137,149,130}, 543 | {142,147,128}, 544 | {137,146,128}, 545 | {137,149,124}, 546 | {131,136,125}, 547 | {129,135,128}, 548 | {131,139,128}, 549 | {132,137,132}, 550 | {135,135,128}, 551 | {131,159,127}, 552 | {131,156,128}, 553 | {136,159,129}, 554 | {133,161,127}, 555 | {131,156,131}, 556 | {131,160,128}, 557 | {128,159,131}, 558 | {120,159,125}, 559 | {125,156,126}, 560 | {125,156,128}, 561 | {142,147,128}, 562 | {142,149,125}, 563 | {143,149,125}, 564 | {142,152,128}, 565 | {123,153,128}, 566 | {125,156,131}, 567 | {123,156,128}, 568 | {125,160,128}, 569 | {128,156,133}, 570 | {125,156,131}, 571 | {124,152,132}, 572 | {123,153,128}, 573 | {133,153,128}, 574 | {131,152,121}, 575 | {133,156,128}, 576 | {131,160,128}, 577 | {125,152,121}, 578 | {128,160,124}, 579 | {131,152,121}, 580 | {131,160,128}, 581 | {102,149,135}, 582 | {103,150,139}, 583 | {104,149,129}, 584 | {107,150,130}, 585 | {107,149,137}, 586 | {109,149,131}, 587 | {103,150,139}, 588 | {107,150,130}, 589 | {102,149,135}, 590 | {104,149,129}, 591 | {103,148,139}, 592 | {107,148,130}, 593 | {109,149,125}, 594 | {108,149,125}, 595 | {106,149,133}, 596 | {105,149,133}, 597 | {105,149,133}, 598 | {108,149,125}, 599 | {106,149,133}, 600 | {109,149,125}, 601 | {109,149,131}, 602 | {107,148,130}, 603 | {107,150,130}, 604 | {104,149,129}, 605 | {97,149,140}, 606 | {102,147,142}, 607 | {100,149,148}, 608 | {107,149,144}, 609 | {97,149,140}, 610 | {100,149,148}, 611 | {102,151,142}, 612 | {107,149,144}, 613 | {114,147,128}, 614 | {113,149,125}, 615 | {114,149,125}, 616 | {114,152,128}, 617 | {130,128,128}, 618 | {131,128,126}, 619 | {133,128,128}, 620 | {131,128,131}, 621 | {126,128,128}, 622 | {125,129,129}, 623 | {125,128,131}, 624 | {123,128,128}, 625 | {126,132,128}, 626 | {125,133,130}, 627 | {125,131,130}, 628 | {123,132,128}, 629 | {121,145,132}, 630 | {128,146,135}, 631 | {130,128,128}, 632 | {131,128,131}, 633 | {131,129,129}, 634 | {133,128,128}, 635 | {130,132,128}, 636 | {131,131,130}, 637 | {131,133,130}, 638 | {133,132,128}, 639 | {134,149,123}, 640 | {133,152,125}, 641 | {139,149,124}, 642 | {134,152,129}, 643 | {120,159,125}, 644 | {125,156,128}, 645 | {120,159,129}, 646 | {125,159,127}, 647 | {131,159,127}, 648 | {136,159,125}, 649 | {131,156,126}, 650 | {131,156,128}, 651 | {125,159,127}, 652 | {123,161,127}, 653 | {108,151,128}, 654 | {113,149,125}, 655 | {108,149,126}, 656 | {108,148,128}, 657 | {111,149,130}, 658 | {114,152,128}, 659 | {108,151,128}, 660 | {113,149,125}, 661 | {125,160,128}, 662 | {128,160,124}, 663 | {128,134,132}, 664 | {128,137,123}, 665 | {133,137,124}, 666 | {133,137,131}, 667 | {123,137,124}, 668 | {123,137,131}, 669 | {123,139,130}, 670 | {124,139,125}, 671 | {128,134,132}, 672 | {128,140,133}, 673 | {124,137,132}, 674 | {121,135,128}, 675 | {125,133,130}, 676 | {123,132,128}, 677 | {106,148,130}, 678 | {108,149,129}, 679 | {127,135,128}, 680 | {125,134,126}, 681 | {125,136,125}, 682 | {121,135,128}, 683 | {106,150,126}, 684 | {108,149,126}, 685 | {133,128,128}, 686 | {131,131,130}, 687 | {131,129,129}, 688 | {130,128,128}, 689 | {131,131,130}, 690 | {133,128,128}, 691 | {133,132,128}, 692 | {131,131,126}, 693 | {146,154,120}, 694 | {154,145,120}, 695 | {154,145,136}, 696 | {146,154,136}, 697 | {123,153,128}, 698 | {133,153,128}, 699 | {132,152,132}, 700 | {124,152,132}, 701 | {125,152,121}, 702 | {131,152,121}, 703 | {133,153,128}, 704 | {123,153,128}, 705 | {137,152,128}, 706 | {133,149,128}, 707 | {137,149,130}, 708 | {103,150,139}, 709 | {109,149,141}, 710 | {107,149,137}, 711 | {109,149,141}, 712 | {103,148,139}, 713 | {107,149,137}, 714 | {102,147,142}, 715 | {105,149,142}, 716 | {107,149,144}, 717 | {106,147,127}, 718 | {106,148,130}, 719 | {104,149,128}, 720 | {150,150,126}, 721 | {152,149,128}, 722 | {150,147,127}, 723 | {102,147,142}, 724 | {103,148,139}, 725 | {105,149,142}, 726 | {102,147,142}, 727 | {100,149,140}, 728 | {103,148,139}, 729 | {124,152,132}, 730 | {132,152,132}, 731 | {128,151,134}, 732 | {100,149,140}, 733 | {102,147,142}, 734 | {97,149,140}, 735 | {150,150,126}, 736 | {150,151,129}, 737 | {152,149,128}, 738 | {128,162,128}, 739 | {128,159,131}, 740 | {131,160,128}, 741 | {105,149,142}, 742 | {102,151,142}, 743 | {107,149,144}, 744 | {123,152,125}, 745 | {122,152,129}, 746 | {128,158,127}, 747 | {100,149,140}, 748 | {97,149,140}, 749 | {102,151,142}, 750 | {134,152,129}, 751 | {133,152,125}, 752 | {128,158,127}, 753 | {114,147,128}, 754 | {116,149,130}, 755 | {111,149,130}, 756 | {128,142,124}, 757 | {134,145,123}, 758 | {132,142,124}, 759 | {103,150,139}, 760 | {102,149,135}, 761 | {98,149,137}, 762 | {109,149,131}, 763 | {103,148,139}, 764 | {107,148,130}, 765 | {124,137,132}, 766 | {127,135,128}, 767 | {125,139,128}, 768 | {103,148,139}, 769 | {100,149,140}, 770 | {98,149,137}, 771 | {105,149,142}, 772 | {103,148,139}, 773 | {109,149,141}, 774 | {133,139,130}, 775 | {132,139,125}, 776 | {134,142,131}, 777 | {123,139,130}, 778 | {122,142,131}, 779 | {124,139,125}, 780 | {107,149,137}, 781 | {103,148,139}, 782 | {109,149,131}, 783 | {125,134,126}, 784 | {123,132,128}, 785 | {121,135,128}, 786 | {102,151,142}, 787 | {103,150,139}, 788 | {100,149,140}, 789 | {131,136,125}, 790 | {131,139,128}, 791 | {135,135,128}, 792 | {102,151,142}, 793 | {105,149,142}, 794 | {103,150,139}, 795 | {103,150,139}, 796 | {105,149,142}, 797 | {109,149,141}, 798 | {100,149,140}, 799 | {103,150,139}, 800 | {98,149,137}, 801 | {103,148,139}, 802 | {98,149,137}, 803 | {102,149,135}, 804 | {119,146,128}, 805 | {119,149,124}, 806 | {123,149,128}, 807 | {155,147,134}, 808 | {155,147,122}, 809 | {149,154,122}, 810 | {149,154,134} 811 | }; 812 | -------------------------------------------------------------------------------- /tools/OBJtoHeader.java: -------------------------------------------------------------------------------- 1 | import java.io.*; 2 | import java.lang.reflect.Array; 3 | import java.util.ArrayList; 4 | 5 | 6 | public class OBJtoHeader { 7 | public static void main(String[] args) throws IOException { 8 | ArrayList lines = new ArrayList<>(); 9 | ArrayList verts = new ArrayList<>(); 10 | ArrayList texCoords = new ArrayList<>(); 11 | ArrayList faces = new ArrayList<>(); 12 | String name = (String) Array.get(args[0].split("\\."),0); 13 | // fetch lines 14 | BufferedReader in = new BufferedReader(new FileReader(args[0])); 15 | Object[] tempLines = in.lines().toArray(); 16 | for(Object line : tempLines) { 17 | lines.add((String) line); 18 | } 19 | in.close(); 20 | 21 | // output 22 | PrintWriter out = new PrintWriter(name + ".c"); 23 | 24 | // fetch 25 | for(String line : lines) { 26 | String[] token = line.split("\\s+"); 27 | 28 | if (token[0].compareToIgnoreCase("v")==0) { 29 | verts.add(new Vertex(token)); 30 | } else if (token[0].compareToIgnoreCase("vt")==0) { 31 | texCoords.add(new TexCoord(token)); 32 | } else if (token[0].compareToIgnoreCase("f")==0) { 33 | faces.add(new Face(token)); 34 | } 35 | 36 | } 37 | 38 | for(Face f : faces) { 39 | f.setUV(texCoords); 40 | } 41 | 42 | // output 43 | out.println("#include "); 44 | out.println("//Model from " + args[0]); 45 | out.println(String.format("static qdVertex verts[%d];",verts.size())); 46 | out.println(String.format("static qdFace faces[%d];",faces.size())); 47 | out.println(String.format("qdObject %s = {0,0,0,%d,%d,verts,faces};",name,verts.size(),faces.size())); 48 | 49 | out.println(String.format("static qdFace faces[%d] = { ",faces.size())); 50 | for(int i = 0;i < faces.size();i++) { 51 | String temp = "\t"+faces.get(i).toString(); 52 | if(i!=(faces.size()-1)) 53 | temp += ","; 54 | out.println(temp); 55 | } 56 | out.println("};"); 57 | 58 | out.println(String.format("static qdVertex verts[%d] = { ",verts.size())); 59 | for(int i = 0;i < verts.size();i++) { 60 | String temp = "\t"+verts.get(i).toString(); 61 | if(i!=(verts.size()-1)) 62 | temp += ","; 63 | out.println(temp); 64 | } 65 | out.println("};"); 66 | 67 | out.close(); 68 | 69 | } 70 | } 71 | 72 | class Vertex { 73 | private int x,y,z; 74 | 75 | public Vertex(String[] args) 76 | { 77 | // vertices stored with (128,128,128) as center 78 | x = 128 + (int)Math.round(Double.parseDouble(args[1])); 79 | y = 128 + (int)Math.round(Double.parseDouble(args[2])); 80 | z = 128 + (int)Math.round(Double.parseDouble(args[3])); 81 | } 82 | 83 | public String toString() 84 | { 85 | return String.format("{%d,%d,%d}",x,y,z); 86 | } 87 | 88 | } 89 | 90 | class TexCoord { 91 | public int u,v; 92 | 93 | public TexCoord(String[] args) 94 | { 95 | u = (int)(255.0*Double.parseDouble(args[1])); 96 | v = 127 - (int)(127.0*Double.parseDouble(args[2])); // blender measure v from bottom left 97 | } 98 | 99 | } 100 | 101 | class Face { 102 | private int[] vertex; 103 | private int texcoord; 104 | private int u,v; 105 | 106 | public Face(String[] args) 107 | { 108 | vertex = new int[4]; 109 | String[] temp; 110 | // split line to get vertex indices 111 | temp = args[1].split("/"); 112 | vertex[0] = Integer.parseInt(temp[0]) - 1; 113 | texcoord = Integer.parseInt(temp[1]) - 1; //only first tex coord counts 114 | 115 | temp = args[2].split("/"); 116 | vertex[1] = Integer.parseInt(temp[0]) - 1; 117 | 118 | temp = args[3].split("/"); 119 | vertex[2] = Integer.parseInt(temp[0]) - 1; 120 | 121 | // for triangles 122 | try { 123 | temp = args[4].split("/"); 124 | vertex[3] = Integer.parseInt(temp[0]) - 1; 125 | } catch(IndexOutOfBoundsException e) { 126 | vertex[3] = vertex[2]; 127 | } 128 | } 129 | 130 | public void setUV(ArrayList arr) { 131 | u = arr.get(texcoord).u; 132 | v = arr.get(texcoord).v; 133 | } 134 | 135 | 136 | public String toString() 137 | { 138 | return String.format("{SHADER_TEXTURED,0xFF,0,0,%d,%d,%d,%d}",vertex[0],vertex[1],vertex[2],vertex[3]); 139 | } 140 | 141 | 142 | } --------------------------------------------------------------------------------