[Scummvm-git-logs] scummvm master -> 1d624d2e1f80a6d0f7835a4c364ce975ece27bc3
mgerhardy
martin.gerhardy at gmail.com
Sat Nov 28 00:10:06 UTC 2020
This automated email contains information about 13 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
82df68fb11 TWINE: extracted rendering types into dedicated methods
6f75c8a823 TWINE: removed unused method parameters
7a11fb592a TWINE: reduced scope
24ce1e5d3e TWINE: refactored reading model data to stream
89bc8dcfb2 TWINE: converted member to method parameter
a17d752cf3 TWINE: convert parameter type and removed casting
808a8712b7 TWINE: code cleanup
f251a088d5 TWINE: cleanup model data parsing
a81e496b7e TWINE: cleanup in Renderer::circleFill
a637786183 TWINE: removed dead code
2b20f54310 TWINE: reduced scope in renderer code
61d49da380 TWINE: reduced scope in renderer code
1d624d2e1f TWINE: cleanup in Renderer::renderModelElements
Commit: 82df68fb115133b6b2dc9764776e12f02af87c0d
https://github.com/scummvm/scummvm/commit/82df68fb115133b6b2dc9764776e12f02af87c0d
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: extracted rendering types into dedicated methods
Changed paths:
engines/twine/renderer.cpp
engines/twine/renderer.h
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index b5c35461d4..e89e41e4ef 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -488,483 +488,509 @@ void Renderer::computePolygons(int16 polyRenderType, vertexData *vertices, int32
}
}
-void Renderer::renderPolygons(int32 renderType, vertexData *vertices, int32 /*numVertices*/, int32 color, int vleft, int vright, int vtop, int vbottom) {
- uint8 *out2;
- int32 currentLine;
+void Renderer::renderPolygonsCopper(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
+ int16 start = ptr1[0];
+ int16 stop = ptr1[SCREEN_HEIGHT];
- uint8 *out = (uint8*)_engine->frontVideoBuffer.getBasePtr(0, vtop);
+ ptr1++;
+ int32 hsize = stop - start;
- int16 *ptr1 = &polyTab[vtop];
- int16 *ptr2 = &polyTab2[vtop];
+ if (hsize >= 0) {
+ uint16 mask = 0x43DB;
+ uint16 dx;
+ int32 startCopy;
- int32 vsize = vbottom - vtop;
- vsize++;
+ dx = (uint8)color;
+ dx |= 0x300;
- switch (renderType) {
- case POLYGONTYPE_FLAT: {
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- int16 stop = ptr1[SCREEN_HEIGHT];
- int16 start = ptr1[0];
-
- ptr1++;
- int32 hsize = stop - start;
+ hsize++;
+ startCopy = start;
+
+ for (int32 j = startCopy; j < hsize + startCopy; j++) {
+ start += mask;
+ start = (start & 0xFF00) | ((start & 0xFF) & (uint8)(dx >> 8));
+ start = (start & 0xFF00) | ((start & 0xFF) + (dx & 0xFF));
+ if (j >= 0 && j < SCREEN_WIDTH) {
+ out[j] = start & 0xFF;
+ }
+ mask = (mask << 2) | (mask >> 14);
+ mask++;
+ }
+ }
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--vsize);
+}
- if (hsize >= 0) {
- hsize++;
- out2 = start + out;
+void Renderer::renderPolygonsBopper(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
+ int16 start = ptr1[0];
+ int16 stop = ptr1[SCREEN_HEIGHT];
+ ptr1++;
+ int32 hsize = stop - start;
- for (int32 j = start; j < hsize + start; j++) {
+ if (hsize >= 0) {
+ hsize++;
+ for (int32 j = start; j < hsize + start; j++) {
+ if ((start + (vtop % 1)) & 1) {
if (j >= 0 && j < SCREEN_WIDTH) {
out[j] = color;
}
}
}
}
- out += SCREEN_WIDTH;
- currentLine++;
- } while (--vsize);
- break;
- }
- case POLYGONTYPE_COPPER: {
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- int16 start = ptr1[0];
- int16 stop = ptr1[SCREEN_HEIGHT];
-
- ptr1++;
- int32 hsize = stop - start;
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--vsize);
+}
- if (hsize >= 0) {
- uint16 mask = 0x43DB;
- uint16 dx;
- int32 startCopy;
+void Renderer::renderPolygonsFlat(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
+ int16 stop = ptr1[SCREEN_HEIGHT];
+ int16 start = ptr1[0];
- dx = (uint8)color;
- dx |= 0x300;
+ ptr1++;
+ int32 hsize = stop - start;
- hsize++;
- out2 = start + out;
- startCopy = start;
+ if (hsize >= 0) {
+ hsize++;
- for (int32 j = startCopy; j < hsize + startCopy; j++) {
- start += mask;
- start = (start & 0xFF00) | ((start & 0xFF) & (uint8)(dx >> 8));
- start = (start & 0xFF00) | ((start & 0xFF) + (dx & 0xFF));
- if (j >= 0 && j < SCREEN_WIDTH) {
- out[j] = start & 0xFF;
- }
- mask = (mask << 2) | (mask >> 14);
- mask++;
+ for (int32 j = start; j < hsize + start; j++) {
+ if (j >= 0 && j < SCREEN_WIDTH) {
+ out[j] = color;
}
}
}
- out += SCREEN_WIDTH;
- currentLine++;
- } while (--vsize);
- break;
- }
- case POLYGONTYPE_BOPPER: { // FIXME: buggy
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- int16 start = ptr1[0];
- int16 stop = ptr1[SCREEN_HEIGHT];
- ptr1++;
- int32 hsize = stop - start;
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--vsize);
+}
- if (hsize >= 0) {
- hsize++;
- out2 = start + out;
- for (int32 j = start; j < hsize + start; j++) {
- if ((start + (vtop % 1)) & 1) {
- if (j >= 0 && j < SCREEN_WIDTH) {
- out[j] = color;
- }
- }
- out2++;
- }
- }
+void Renderer::renderPolygonsTele(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ int ax;
+ int bx;
+ unsigned short int dx;
+ unsigned short int temp;
+ bx = (unsigned short)color << 0x10;
+ int32 renderLoop = vsize;
+ do {
+ int16 start;
+ int16 stop;
+ int32 hsize;
+ while (1) {
+ start = ptr1[0];
+ stop = ptr1[SCREEN_HEIGHT];
+ ptr1++;
+ hsize = stop - start;
+
+ if (hsize) {
+ break;
}
+
+ uint8 *out2 = start + out;
+ *out2 = ((unsigned short)(bx >> 0x18)) & 0x0F;
+
+ color = *(out2 + 1);
+
out += SCREEN_WIDTH;
- currentLine++;
- } while (--vsize);
- break;
- }
- case POLYGONTYPE_MARBLE: { // TODO: implement this
- break;
- }
- case POLYGONTYPE_TELE: { // FIXME: buggy
- int ax;
- int bx;
- unsigned short int dx;
- unsigned short int temp;
- bx = (unsigned short)color << 0x10;
- int32 renderLoop = vsize;
- do {
- int16 start;
- int16 stop;
- int32 hsize;
- while (1) {
- start = ptr1[0];
- stop = ptr1[SCREEN_HEIGHT];
- ptr1++;
- hsize = stop - start;
- if (hsize) {
- break;
- }
+ --renderLoop;
+ if (!renderLoop) {
+ return;
+ }
+ }
- out2 = start + out;
- *out2 = ((unsigned short)(bx >> 0x18)) & 0x0F;
+ if (stop >= start) {
+ hsize++;
+ bx = (unsigned short)(color >> 0x10);
+ uint8 *out2 = start + out;
- color = *(out2 + 1);
+ ax = (bx & 0xF0) << 8;
+ bx = bx << 8;
+ ax += (bx & 0x0F);
+ ax -= bx;
+ ax++;
+ ax = ax >> 16;
- out += SCREEN_WIDTH;
+ ax = ax / hsize;
+ temp = (ax & 0xF0);
+ temp = temp >> 8;
+ temp += (ax & 0x0F);
+ ax = temp;
- --renderLoop;
- if (!renderLoop) {
- return;
- }
+ dx = ax;
+
+ ax = (ax & 0x0F) + (bx & 0xF0);
+ hsize++;
+
+ if (hsize & 1) {
+ ax = 0; // not sure about this
}
- if (stop >= start) {
- hsize++;
- bx = (unsigned short)(color >> 0x10);
- out2 = start + out;
+ int32 j = hsize >> 1;
- ax = (bx & 0xF0) << 8;
- bx = bx << 8;
- ax += (bx & 0x0F);
- ax -= bx;
- ax++;
- ax = ax >> 16;
+ while (1) {
+ *(out2++) = ax & 0x0F;
+ ax += dx;
- ax = ax / hsize;
- temp = (ax & 0xF0);
- temp = temp >> 8;
- temp += (ax & 0x0F);
- ax = temp;
+ --j;
+ if (!j) {
+ break;
+ }
- dx = ax;
+ *(out2++) = ax & 0x0F;
+ ax += dx;
+ }
+ }
- ax = (ax & 0x0F) + (bx & 0xF0);
- hsize++;
+ out += SCREEN_WIDTH;
+ --renderLoop;
- if (hsize & 1) {
- ax = 0; // not sure about this
- }
+ } while (renderLoop);
+}
- int32 j = hsize >> 1;
+// FIXME: buggy
+void Renderer::renderPolygonsTras(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ do {
+ unsigned short int bx;
- while (1) {
- *(out2++) = ax & 0x0F;
- ax += dx;
+ int16 start = ptr1[0];
+ int16 stop = ptr1[SCREEN_HEIGHT];
- --j;
- if (!j) {
- break;
- }
+ ptr1++;
+ int32 hsize = stop - start;
+
+ if (hsize >= 0) {
+ hsize++;
+ uint8 *out2 = start + out;
- *(out2++) = ax & 0x0F;
- ax += dx;
+ if ((hsize >> 1) < 0) {
+ bx = color & 0xFF;
+ bx = bx << 8;
+ bx += color & 0xFF;
+ for (int32 j = 0; j < hsize; j++) {
+ *(out2) = (*(out2)&0x0F0F) | bx;
}
+ } else {
+ *(out2) = (*(out2)&0x0F) | color;
+ out2++;
}
+ }
+ out += SCREEN_WIDTH;
+ } while (--vsize);
+}
- out += SCREEN_WIDTH;
- --renderLoop;
-
- } while (renderLoop);
- break;
- }
- case POLYGONTYPE_TRAS: { // FIXME: buggy
- do {
- unsigned short int bx;
+// FIXME: buggy
+void Renderer::renderPolygonTrame(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ unsigned char bh = 0;
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
int16 start = ptr1[0];
int16 stop = ptr1[SCREEN_HEIGHT];
-
ptr1++;
int32 hsize = stop - start;
if (hsize >= 0) {
hsize++;
- out2 = start + out;
+ uint8 *out2 = start + out;
+
+ hsize /= 2;
+ if (hsize > 1) {
+ uint16 ax;
+ bh ^= 1;
+ ax = (uint16)(*out2);
+ ax &= 1;
+ if (ax ^ bh) {
+ out2++;
+ }
- if ((hsize >> 1) < 0) {
- bx = color & 0xFF;
- bx = bx << 8;
- bx += color & 0xFF;
for (int32 j = 0; j < hsize; j++) {
- *(out2) = (*(out2)&0x0F0F) | bx;
+ *(out2) = (uint8)color;
+ out2 += 2;
}
- } else {
- *(out2) = (*(out2)&0x0F) | color;
- out2++;
}
}
- out += SCREEN_WIDTH;
- } while (--vsize);
- break;
- }
- case POLYGONTYPE_TRAME: { // FIXME: buggy
- unsigned char bh = 0;
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--vsize);
+}
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- int16 start = ptr1[0];
- int16 stop = ptr1[SCREEN_HEIGHT];
- ptr1++;
- int32 hsize = stop - start;
+void Renderer::renderPolygonsGouraud(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ const int16 *ptr2 = &polyTab2[vtop];
+ int32 renderLoop = vsize;
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
+ uint16 startColor = ptr2[0];
+ uint16 stopColor = ptr2[SCREEN_HEIGHT];
+
+ int16 colorSize = stopColor - startColor;
- if (hsize >= 0) {
+ int16 stop = ptr1[SCREEN_HEIGHT]; // stop
+ int16 start = ptr1[0]; // start
+
+ ptr1++;
+ uint8 *out2 = start + out;
+ int32 hsize = stop - start;
+
+ //varf2 = ptr2[SCREEN_HEIGHT];
+ //varf3 = ptr2[0];
+
+ ptr2++;
+
+ //varf4 = (float)((int32)varf2 - (int32)varf3);
+
+ if (hsize == 0) {
+ if (start >= 0 && start < SCREEN_WIDTH) {
+ *out2 = ((startColor + stopColor) / 2) >> 8; // moyenne des 2 couleurs
+ }
+ } else if (hsize > 0) {
+ if (hsize == 1) {
+ if (start >= -1 && start < SCREEN_WIDTH - 1) {
+ *(out2 + 1) = stopColor >> 8;
+ }
+
+ if (start >= 0 && start < SCREEN_WIDTH) {
+ *(out2) = startColor >> 8;
+ }
+ } else if (hsize == 2) {
+ if (start >= -2 && start < SCREEN_WIDTH - 2) {
+ *(out2 + 2) = stopColor >> 8;
+ }
+
+ if (start >= -1 && start < SCREEN_WIDTH - 1) {
+ *(out2 + 1) = ((startColor + stopColor) / 2) >> 8;
+ }
+
+ if (start >= 0 && start < SCREEN_WIDTH) {
+ *(out2) = startColor >> 8;
+ }
+ } else {
+ int32 currentXPos = start;
+ colorSize /= hsize;
hsize++;
- out2 = start + out;
-
- hsize /= 2;
- if (hsize > 1) {
- uint16 ax;
- bh ^= 1;
- ax = (uint16)(*out2);
- ax &= 1;
- if (ax ^ bh) {
- out2++;
- }
- for (int32 j = 0; j < hsize; j++) {
- *(out2) = (uint8)color;
- out2 += 2;
+ if (hsize % 2) {
+ hsize /= 2;
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = startColor >> 8;
}
+ out2++;
+ currentXPos++;
+ startColor += colorSize;
+ } else {
+ hsize /= 2;
}
+
+ do {
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = startColor >> 8;
+ }
+
+ currentXPos++;
+ startColor += colorSize;
+
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2 + 1) = startColor >> 8;
+ }
+
+ currentXPos++;
+ out2 += 2;
+ startColor += colorSize;
+ } while (--hsize);
}
}
- out += SCREEN_WIDTH;
- currentLine++;
- } while (--vsize);
- break;
- }
- case POLYGONTYPE_GOURAUD: {
- int32 renderLoop = vsize;
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- uint16 startColor = ptr2[0];
- uint16 stopColor = ptr2[SCREEN_HEIGHT];
-
- int16 colorSize = stopColor - startColor;
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--renderLoop);
+}
- int16 stop = ptr1[SCREEN_HEIGHT]; // stop
- int16 start = ptr1[0]; // start
+void Renderer::renderPolygonsDither(uint8 *out, int vtop, int32 vsize, int32 color) const {
+ const int16 *ptr1 = &polyTab[vtop];
+ const int16 *ptr2 = &polyTab2[vtop];
+ int32 renderLoop = vsize;
- ptr1++;
- out2 = start + out;
- int32 hsize = stop - start;
+ int32 currentLine = vtop;
+ do {
+ if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
+ int16 stop = ptr1[SCREEN_HEIGHT]; // stop
+ int16 start = ptr1[0]; // start
+ ptr1++;
+ int32 hsize = stop - start;
- //varf2 = ptr2[SCREEN_HEIGHT];
- //varf3 = ptr2[0];
+ if (hsize >= 0) {
+ uint16 startColor = ptr2[0];
+ uint16 stopColor = ptr2[SCREEN_HEIGHT];
+ int32 currentXPos = start;
+ uint8 *out2 = start + out;
ptr2++;
- //varf4 = (float)((int32)varf2 - (int32)varf3);
-
if (hsize == 0) {
- if (start >= 0 && start < SCREEN_WIDTH) {
- *out2 = ((startColor + stopColor) / 2) >> 8; // moyenne des 2 couleurs
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = (uint8)(((startColor + stopColor) / 2) >> 8);
}
- } else if (hsize > 0) {
+ } else {
+ int16 colorSize = stopColor - startColor;
if (hsize == 1) {
- if (start >= -1 && start < SCREEN_WIDTH - 1) {
- *(out2 + 1) = stopColor >> 8;
- }
+ uint16 currentColor = startColor;
+ hsize++;
+ hsize /= 2;
- if (start >= 0 && start < SCREEN_WIDTH) {
- *(out2) = startColor >> 8;
- }
- } else if (hsize == 2) {
- if (start >= -2 && start < SCREEN_WIDTH - 2) {
- *(out2 + 2) = stopColor >> 8;
+ currentColor &= 0xFF;
+ currentColor += startColor;
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = currentColor >> 8;
}
- if (start >= -1 && start < SCREEN_WIDTH - 1) {
- *(out2 + 1) = ((startColor + stopColor) / 2) >> 8;
- }
+ currentColor &= 0xFF;
+ startColor += colorSize;
+ currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
+ currentColor += startColor;
- if (start >= 0 && start < SCREEN_WIDTH) {
- *(out2) = startColor >> 8;
+ currentXPos++;
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2 + 1) = currentColor >> 8;
}
- } else {
- int32 currentXPos = start;
- colorSize /= hsize;
+ } else if (hsize == 2) {
+ uint16 currentColor = startColor;
hsize++;
+ hsize /= 2;
- if (hsize % 2) {
- hsize /= 2;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = startColor >> 8;
- }
- out2++;
- currentXPos++;
- startColor += colorSize;
- } else {
- hsize /= 2;
+ currentColor &= 0xFF;
+ colorSize /= 2;
+ currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
+ currentColor += startColor;
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = currentColor >> 8;
}
- do {
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = startColor >> 8;
- }
-
- currentXPos++;
- startColor += colorSize;
-
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2 + 1) = startColor >> 8;
- }
+ out2++;
+ currentXPos++;
+ startColor += colorSize;
- currentXPos++;
- out2 += 2;
- startColor += colorSize;
- } while (--hsize);
- }
- }
- }
- out += SCREEN_WIDTH;
- currentLine++;
- } while (--renderLoop);
- break;
- }
- case POLYGONTYPE_DITHER: { // dithering
- int32 renderLoop = vsize;
+ currentColor &= 0xFF;
+ currentColor += startColor;
- currentLine = vtop;
- do {
- if (currentLine >= 0 && currentLine < SCREEN_HEIGHT) {
- int16 stop = ptr1[SCREEN_HEIGHT]; // stop
- int16 start = ptr1[0]; // start
- ptr1++;
- int32 hsize = stop - start;
-
- if (hsize >= 0) {
- uint16 startColor = ptr2[0];
- uint16 stopColor = ptr2[SCREEN_HEIGHT];
- int32 currentXPos = start;
+ if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
+ *(out2) = currentColor >> 8;
+ }
- out2 = start + out;
- ptr2++;
+ currentColor &= 0xFF;
+ startColor += colorSize;
+ currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
+ currentColor += startColor;
- if (hsize == 0) {
+ currentXPos++;
if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = (uint8)(((startColor + stopColor) / 2) >> 8);
+ *(out2 + 1) = currentColor >> 8;
}
} else {
- int16 colorSize = stopColor - startColor;
- if (hsize == 1) {
- uint16 currentColor = startColor;
- hsize++;
- hsize /= 2;
-
- currentColor &= 0xFF;
- currentColor += startColor;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = currentColor >> 8;
- }
-
- currentColor &= 0xFF;
- startColor += colorSize;
- currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
- currentColor += startColor;
+ uint16 currentColor = startColor;
+ colorSize /= hsize;
+ hsize++;
- currentXPos++;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2 + 1) = currentColor >> 8;
- }
- } else if (hsize == 2) {
- uint16 currentColor = startColor;
- hsize++;
+ if (hsize % 2) {
hsize /= 2;
-
currentColor &= 0xFF;
- colorSize /= 2;
currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
currentColor += startColor;
if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
*(out2) = currentColor >> 8;
}
-
out2++;
currentXPos++;
- startColor += colorSize;
+ } else {
+ hsize /= 2;
+ }
+ do {
currentColor &= 0xFF;
currentColor += startColor;
-
if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
*(out2) = currentColor >> 8;
}
-
+ currentXPos++;
currentColor &= 0xFF;
startColor += colorSize;
currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
currentColor += startColor;
-
- currentXPos++;
if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
*(out2 + 1) = currentColor >> 8;
}
- } else {
- uint16 currentColor = startColor;
- colorSize /= hsize;
- hsize++;
-
- if (hsize % 2) {
- hsize /= 2;
- currentColor &= 0xFF;
- currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
- currentColor += startColor;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = currentColor >> 8;
- }
- out2++;
- currentXPos++;
- } else {
- hsize /= 2;
- }
-
- do {
- currentColor &= 0xFF;
- currentColor += startColor;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2) = currentColor >> 8;
- }
- currentXPos++;
- currentColor &= 0xFF;
- startColor += colorSize;
- currentColor = ((currentColor & (0xFF00)) | ((((currentColor & 0xFF) << (hsize & 0xFF))) & 0xFF));
- currentColor += startColor;
- if (currentXPos >= 0 && currentXPos < SCREEN_WIDTH) {
- *(out2 + 1) = currentColor >> 8;
- }
- currentXPos++;
- out2 += 2;
- startColor += colorSize;
- } while (--hsize);
- }
+ currentXPos++;
+ out2 += 2;
+ startColor += colorSize;
+ } while (--hsize);
}
}
}
- out += SCREEN_WIDTH;
- currentLine++;
- } while (--renderLoop);
+ }
+ out += SCREEN_WIDTH;
+ currentLine++;
+ } while (--renderLoop);
+}
+
+void Renderer::renderPolygonsMarble(uint8 *out, int vtop, int32 vsize, int32 color) const {
+}
+
+void Renderer::renderPolygons(int32 renderType, vertexData *vertices, int32 /*numVertices*/, int32 color, int vleft, int vright, int vtop, int vbottom) {
+ uint8 *out = (uint8*)_engine->frontVideoBuffer.getBasePtr(0, vtop);
+ const int32 vsize = vbottom - vtop + 1;
+
+ switch (renderType) {
+ case POLYGONTYPE_FLAT:
+ renderPolygonsFlat(out, vtop, vsize, color);
break;
- }
- default: {
+ case POLYGONTYPE_COPPER:
+ renderPolygonsCopper(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_BOPPER:
+ renderPolygonsBopper(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_TELE:
+ renderPolygonsTele(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_TRAS:
+ renderPolygonsTras(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_TRAME:
+ renderPolygonTrame(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_GOURAUD:
+ renderPolygonsGouraud(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_DITHER:
+ renderPolygonsDither(out, vtop, vsize, color);
+ break;
+ case POLYGONTYPE_MARBLE:
+ renderPolygonsMarble(out, vtop, vsize, color);
+ break;
+ default:
warning("RENDER WARNING: Unsuported render type %d", renderType);
break;
}
- };
}
void Renderer::renderPolygons(int32 polyRenderType, int32 color) {
diff --git a/engines/twine/renderer.h b/engines/twine/renderer.h
index c1faeb3eca..6f3e41f634 100644
--- a/engines/twine/renderer.h
+++ b/engines/twine/renderer.h
@@ -198,6 +198,16 @@ private:
bool isUsingOrhoProjection = false;
+ void renderPolygonsCopper(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsBopper(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsFlat(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsTele(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsTras(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonTrame(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsGouraud(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsDither(uint8 *out, int vtop, int32 vsize, int32 color) const;
+ void renderPolygonsMarble(uint8 *out, int vtop, int32 vsize, int32 color) const;
+
void computePolygons(int16 polyRenderType, vertexData *vertices, int32 numVertices, int &vleft, int &vright, int &vtop, int &vbottom);
void renderPolygons(int32 renderType, vertexData *vertices, int32 numVertices, int32 color, int vleft, int vright, int vtop, int vbottom);
Commit: 6f75c8a8235c093b04dd94de11ba76daa1da58ad
https://github.com/scummvm/scummvm/commit/6f75c8a8235c093b04dd94de11ba76daa1da58ad
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: removed unused method parameters
Changed paths:
engines/twine/renderer.cpp
engines/twine/renderer.h
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index e89e41e4ef..d17fe7fc94 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -955,7 +955,7 @@ void Renderer::renderPolygonsDither(uint8 *out, int vtop, int32 vsize, int32 col
void Renderer::renderPolygonsMarble(uint8 *out, int vtop, int32 vsize, int32 color) const {
}
-void Renderer::renderPolygons(int32 renderType, vertexData *vertices, int32 /*numVertices*/, int32 color, int vleft, int vright, int vtop, int vbottom) {
+void Renderer::renderPolygons(int32 renderType, int32 color, int vleft, int vright, int vtop, int vbottom) {
uint8 *out = (uint8*)_engine->frontVideoBuffer.getBasePtr(0, vtop);
const int32 vsize = vbottom - vtop + 1;
@@ -1000,7 +1000,7 @@ void Renderer::renderPolygons(int32 polyRenderType, int32 color) {
int vbottom = 0;
vertexData *vertices = (vertexData *)vertexCoordinates;
computePolygons(polyRenderType, vertices, numOfVertex, vleft, vright, vtop, vbottom);
- renderPolygons(polyRenderType, vertices, numOfVertex, color, vleft, vright, vtop, vbottom);
+ renderPolygons(polyRenderType, color, vleft, vright, vtop, vbottom);
}
void Renderer::circleFill(int32 x, int32 y, int32 radius, int8 color) {
diff --git a/engines/twine/renderer.h b/engines/twine/renderer.h
index 6f3e41f634..53c72fbc43 100644
--- a/engines/twine/renderer.h
+++ b/engines/twine/renderer.h
@@ -209,7 +209,7 @@ private:
void renderPolygonsMarble(uint8 *out, int vtop, int32 vsize, int32 color) const;
void computePolygons(int16 polyRenderType, vertexData *vertices, int32 numVertices, int &vleft, int &vright, int &vtop, int &vbottom);
- void renderPolygons(int32 renderType, vertexData *vertices, int32 numVertices, int32 color, int vleft, int vright, int vtop, int vbottom);
+ void renderPolygons(int32 renderType, int32 color, int vleft, int vright, int vtop, int vbottom);
public:
Renderer(TwinEEngine *engine) : _engine(engine) {}
Commit: 7a11fb592a52950f7cddba778fc18e6d29daec57
https://github.com/scummvm/scummvm/commit/7a11fb592a52950f7cddba778fc18e6d29daec57
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: reduced scope
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index d17fe7fc94..13668d1368 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1026,16 +1026,11 @@ void Renderer::circleFill(int32 x, int32 y, int32 radius, int8 color) {
}
int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, renderTabEntry **renderTabEntryPtr) {
- int16 counter;
- int16 type;
-
int32 bestDepth;
int32 currentDepth;
int32 bestPoly = 0;
// int32 ecx;
- pointTab *currentVertex;
-
// prepare polygons
uint8 *edi = renderTab7; // renderTab7 coordinates buffer
@@ -1065,7 +1060,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
pointer += 2;
edi += 4;
- counter = destinationHeader->numOfVertex;
+ int16 counter = destinationHeader->numOfVertex;
bestDepth = -32000;
renderV19 = edi;
@@ -1079,7 +1074,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
currentComputedVertex->shadeValue = shadeValue;
- currentVertex = &flattenPoints[currentPolyVertex->dataOffset / sizeof(pointTab)];
+ pointTab *currentVertex = &flattenPoints[currentPolyVertex->dataOffset / sizeof(pointTab)];
pointTab *destinationVertex = (pointTab *)(edi + 2);
destinationVertex->x = currentVertex->x;
@@ -1093,7 +1088,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
- } while (--counter);
+ } while (--counter > 0);
} else if (polyRenderType >= POLYGONTYPE_GOURAUD) { // only 1 shade value is used
polyHeader *destinationHeader = (polyHeader *)edi;
@@ -1111,13 +1106,13 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
edi += 4;
renderV19 = edi;
bestDepth = -32000;
- counter = destinationHeader->numOfVertex;
+ int16 counter = destinationHeader->numOfVertex;
do {
int32 eax = *((const int16 *)pointer);
pointer += 2;
- currentVertex = &flattenPoints[eax / sizeof(pointTab)];
+ pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
pointTab *destinationVertex = (pointTab *)(edi + 2);
@@ -1131,7 +1126,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
- } while (--counter);
+ } while (--counter > 0);
} else { // no shade is used
polyHeader *destinationHeader = (polyHeader *)edi;
@@ -1145,13 +1140,13 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
bestDepth = -32000;
renderV19 = edi;
int32 eax = 0;
- counter = currentPolyHeader->numOfVertex;
+ int16 counter = currentPolyHeader->numOfVertex;
do {
eax = *((const int16 *)pointer);
pointer += 2;
- currentVertex = &flattenPoints[eax / sizeof(pointTab)];
+ pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
pointTab *destinationVertex = (pointTab *)(edi + 2);
@@ -1165,7 +1160,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
- } while (--(counter));
+ } while (--counter > 0);
}
uint8 *render24 = edi;
@@ -1310,7 +1305,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
renderV19 = pointer;
do {
- type = renderTabEntryPtr2->renderType;
+ int16 type = renderTabEntryPtr2->renderType;
pointer = renderTabEntryPtr2->dataPtr;
renderV19 += 8;
Commit: 24ce1e5d3e21dfa0910ac1859b01028f8962b8e6
https://github.com/scummvm/scummvm/commit/24ce1e5d3e21dfa0910ac1859b01028f8962b8e6
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: refactored reading model data to stream
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index 13668d1368..db13f5f6ed 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -21,6 +21,8 @@
*/
#include "twine/renderer.h"
+#include "common/memstream.h"
+#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
#include "twine/actor.h"
@@ -1033,31 +1035,34 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
// prepare polygons
+ // TODO: proper size
+ Common::MemoryReadStream stream(pointer, 100000);
+ int16 numPolygons = stream.readSint16LE();
+
uint8 *edi = renderTab7; // renderTab7 coordinates buffer
- int16 temp = *((const int16 *)pointer); // we read the number of polygons
- pointer += 2;
uint8 *renderV19 = nullptr; // RECHECK THIS
- if (temp) {
- int16 primitiveCounter = temp; // the number of primitives = the number of polygons
+ if (numPolygons > 0) {
+ int16 primitiveCounter = numPolygons; // the number of primitives = the number of polygons
do { // loop that load all the polygons
uint8 *render23 = edi;
- const polyHeader *currentPolyHeader = (const polyHeader *)pointer;
+ polyHeader currentPolyHeader;
+ currentPolyHeader.renderType = stream.readByte();
+ currentPolyHeader.numOfVertex = stream.readByte();
+ currentPolyHeader.colorIndex = stream.readSint16LE();
//ecx = *((int32*) pointer);
- pointer += 2;
- int16 polyRenderType = currentPolyHeader->renderType;
+ int16 polyRenderType = currentPolyHeader.renderType;
// TODO: RECHECK coordinates axis
if (polyRenderType >= 9) {
polyHeader *destinationHeader = (polyHeader *)edi;
- destinationHeader->renderType = currentPolyHeader->renderType - 2;
- destinationHeader->numOfVertex = currentPolyHeader->numOfVertex;
- destinationHeader->colorIndex = currentPolyHeader->colorIndex;
+ destinationHeader->renderType = currentPolyHeader.renderType - 2;
+ destinationHeader->numOfVertex = currentPolyHeader.numOfVertex;
+ destinationHeader->colorIndex = currentPolyHeader.colorIndex;
- pointer += 2;
edi += 4;
int16 counter = destinationHeader->numOfVertex;
@@ -1066,22 +1071,23 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
renderV19 = edi;
do {
- const polyVertexHeader *currentPolyVertex = (const polyVertexHeader *)pointer;
+ polyVertexHeader currentPolyVertex;
+ currentPolyVertex.shadeEntry = stream.readSint16LE();
+ currentPolyVertex.dataOffset = stream.readSint16LE();
- int16 shadeValue = currentPolyHeader->colorIndex + shadeTable[currentPolyVertex->shadeEntry];
+ int16 shadeValue = currentPolyHeader.colorIndex + shadeTable[currentPolyVertex.shadeEntry];
computedVertex *currentComputedVertex = (computedVertex *)edi;
currentComputedVertex->shadeValue = shadeValue;
- pointTab *currentVertex = &flattenPoints[currentPolyVertex->dataOffset / sizeof(pointTab)];
+ pointTab *currentVertex = &flattenPoints[currentPolyVertex.dataOffset / sizeof(pointTab)];
pointTab *destinationVertex = (pointTab *)(edi + 2);
destinationVertex->x = currentVertex->x;
destinationVertex->y = currentVertex->y;
edi += sizeof(pointTab);
- pointer += 4;
currentDepth = currentVertex->z;
@@ -1092,14 +1098,12 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
} else if (polyRenderType >= POLYGONTYPE_GOURAUD) { // only 1 shade value is used
polyHeader *destinationHeader = (polyHeader *)edi;
- destinationHeader->renderType = currentPolyHeader->renderType - 7;
- destinationHeader->numOfVertex = currentPolyHeader->numOfVertex;
+ destinationHeader->renderType = currentPolyHeader.renderType - 7;
+ destinationHeader->numOfVertex = currentPolyHeader.numOfVertex;
- int16 color = currentPolyHeader->colorIndex;
+ int16 color = currentPolyHeader.colorIndex;
- int16 shadeEntry = *((const int16 *)(pointer + 2));
-
- pointer += 4;
+ int16 shadeEntry = stream.readSint16LE();
*((int16 *)(edi + 2)) = color + shadeTable[shadeEntry];
@@ -1109,8 +1113,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
int16 counter = destinationHeader->numOfVertex;
do {
- int32 eax = *((const int16 *)pointer);
- pointer += 2;
+ int32 eax = stream.readSint16LE();
pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
@@ -1130,21 +1133,19 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
} else { // no shade is used
polyHeader *destinationHeader = (polyHeader *)edi;
- destinationHeader->renderType = currentPolyHeader->renderType;
- destinationHeader->numOfVertex = currentPolyHeader->numOfVertex;
- destinationHeader->colorIndex = currentPolyHeader->colorIndex;
+ destinationHeader->renderType = currentPolyHeader.renderType;
+ destinationHeader->numOfVertex = currentPolyHeader.numOfVertex;
+ destinationHeader->colorIndex = currentPolyHeader.colorIndex;
- pointer += 2;
edi += 4;
bestDepth = -32000;
renderV19 = edi;
int32 eax = 0;
- int16 counter = currentPolyHeader->numOfVertex;
+ int16 counter = currentPolyHeader.numOfVertex;
do {
- eax = *((const int16 *)pointer);
- pointer += 2;
+ eax = stream.readSint16LE();
pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
@@ -1207,21 +1208,23 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
// prepare lines
- temp = *((const int16 *)pointer);
- pointer += 2;
+ int16 temp = stream.readSint16LE();
if (temp) {
numOfPrimitives += temp;
do {
- const lineData *lineDataPtr = (const lineData *)pointer;
+ lineData line;
+ line.data = stream.readSint32LE();
+ line.p1 = stream.readSint16LE();;
+ line.p2 = stream.readSint16LE();;
lineCoordinates *lineCoordinatesPtr = (lineCoordinates *)edi;
- if (*((const int16 *)&lineDataPtr->p1) % 6 != 0 || *((const int16 *)&lineDataPtr->p2) % 6 != 0) {
+ if (line.p1 % 6 != 0 || line.p2 % 6 != 0) {
error("RENDER ERROR: lineDataPtr reference is malformed!");
}
- const int32 point1 = *((const int16 *)&lineDataPtr->p1) / 6;
- const int32 point2 = *((const int16 *)&lineDataPtr->p2) / 6;
- const int32 param = *((const int32 *)&lineDataPtr->data);
+ const int32 point1 = line.p1 / 6;
+ const int32 point2 = line.p2 / 6;
+ const int32 param = line.data;
*((int32 *)&lineCoordinatesPtr->data) = param;
*((int16 *)&lineCoordinatesPtr->x1) = flattenPoints[point1].x;
*((int16 *)&lineCoordinatesPtr->y1) = flattenPoints[point1].y;
@@ -1239,21 +1242,20 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
(*renderTabEntryPtr)->dataPtr = edi;
(*renderTabEntryPtr)++;
- pointer += 8;
edi += 12;
} while (--temp);
}
// prepare spheres
-
- temp = *((const int16 *)pointer);
- pointer += 2;
+ temp = stream.readSint16LE();
if (temp) {
numOfPrimitives += temp;
do {
- uint8 color2 = *(pointer + 1);
- int16 center = *((const uint16 *)(pointer + 6));
- int16 size = *((const uint16 *)(pointer + 4));
+ stream.skip(1);
+ uint8 color2 = stream.readByte();
+ stream.skip(2);
+ int16 size = stream.readUint16LE();
+ int16 center = stream.readUint16LE();
*(uint8 *)edi = color2;
*((int16 *)(edi + 1)) = flattenPoints[center / sizeof(pointTab)].x;
@@ -1265,7 +1267,6 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
(*renderTabEntryPtr)->dataPtr = edi;
(*renderTabEntryPtr)++;
- pointer += 8;
edi += 7;
} while (--temp);
}
@@ -1302,7 +1303,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
}
int16 primitiveCounter = numOfPrimitives;
- renderV19 = pointer;
+ renderV19 = pointer + stream.pos();
do {
int16 type = renderTabEntryPtr2->renderType;
Commit: 89bc8dcfb2f4ef71d58528488e6e65a017a3290b
https://github.com/scummvm/scummvm/commit/89bc8dcfb2f4ef71d58528488e6e65a017a3290b
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: converted member to method parameter
Changed paths:
engines/twine/renderer.cpp
engines/twine/renderer.h
engines/twine/text.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index db13f5f6ed..fa0593fdbb 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -995,14 +995,14 @@ void Renderer::renderPolygons(int32 renderType, int32 color, int vleft, int vrig
}
}
-void Renderer::renderPolygons(int32 polyRenderType, int32 color) {
+void Renderer::renderPolygons(const polyHeader &polyHeader) {
int vleft = 0;
int vright = 0;
int vtop = 0;
int vbottom = 0;
vertexData *vertices = (vertexData *)vertexCoordinates;
- computePolygons(polyRenderType, vertices, numOfVertex, vleft, vright, vtop, vbottom);
- renderPolygons(polyRenderType, color, vleft, vright, vtop, vbottom);
+ computePolygons(polyHeader.renderType, vertices, polyHeader.numOfVertex, vleft, vright, vtop, vbottom);
+ renderPolygons(polyHeader.renderType, polyHeader.colorIndex, vleft, vright, vtop, vbottom);
}
void Renderer::circleFill(int32 x, int32 y, int32 radius, int8 color) {
@@ -1328,19 +1328,22 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
pointer += 4;
int16 polyRenderType = eax & 0xFF;
- numOfVertex = (eax & 0xFF00) >> 8;
+ uint8 numOfVertex = (eax & 0xFF00) >> 8;
int16 color = (eax & 0xFF0000) >> 16;
uint8 *destPtr = (uint8 *)vertexCoordinates;
-
- for (int32 i = 0; i < (numOfVertex * 3); i++) {
+ const int32 triangleCount = numOfVertex * 3;
+ for (int32 i = 0; i < triangleCount; i++) {
*((int16 *)destPtr) = *((const int16 *)pointer);
destPtr += 2;
pointer += 2;
}
- renderPolygons(polyRenderType, color);
-
+ polyHeader polyHeader;
+ polyHeader.renderType = polyRenderType;
+ polyHeader.numOfVertex = numOfVertex;
+ polyHeader.colorIndex = color;
+ renderPolygons(polyHeader);
break;
}
case RENDERTYPE_DRAWSPHERE: { // draw a sphere
diff --git a/engines/twine/renderer.h b/engines/twine/renderer.h
index 53c72fbc43..009f48cdc6 100644
--- a/engines/twine/renderer.h
+++ b/engines/twine/renderer.h
@@ -40,6 +40,12 @@ namespace TwinE {
class TwinEEngine;
+struct polyHeader {
+ uint8 renderType = 0; //FillVertic_AType
+ uint8 numOfVertex = 0;
+ int16 colorIndex = 0;
+};
+
class Renderer {
private:
TwinEEngine *_engine;
@@ -93,12 +99,6 @@ private:
int16 p2 = 0;
};
- struct polyHeader {
- uint8 renderType = 0; //FillVertic_AType
- uint8 numOfVertex = 0;
- int16 colorIndex = 0;
- };
-
struct polyVertexHeader {
int16 shadeEntry = 0;
int16 dataOffset = 0;
@@ -231,13 +231,12 @@ public:
const int16 *shadeAngleTab3 = nullptr; // tab3
- int32 numOfVertex = 0;
int16 vertexCoordinates[193] {0};
void setLightVector(int32 angleX, int32 angleY, int32 angleZ);
void prepareIsoModel(uint8 *bodyPtr); // loadGfxSub
- void renderPolygons(int32 polyRenderType, int32 color);
+ void renderPolygons(const polyHeader &polyHeader);
int32 projectPositionOnScreen(int32 cX, int32 cY, int32 cZ);
void setCameraPosition(int32 x, int32 y, int32 cX, int32 cY, int32 cZ);
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index c3bb51aa05..54b6e3b2f9 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -468,9 +468,11 @@ void Text::renderContinueReadingTriangle() {
_engine->_renderer->vertexCoordinates[7] = _engine->_renderer->vertexCoordinates[1];
_engine->_renderer->vertexCoordinates[8] = _engine->_renderer->vertexCoordinates[5];
- _engine->_renderer->numOfVertex = 3;
-
- _engine->_renderer->renderPolygons(POLYGONTYPE_FLAT, _dialTextStopColor);
+ polyHeader polyHdr;
+ polyHdr.numOfVertex = 3;
+ polyHdr.colorIndex = _dialTextStopColor;
+ polyHdr.renderType = POLYGONTYPE_FLAT;
+ _engine->_renderer->renderPolygons(polyHdr);
_engine->copyBlockPhys(Common::Rect(left, top, right, bottom));
}
Commit: a17d752cf377299c47200959b486f93f1c8eb60e
https://github.com/scummvm/scummvm/commit/a17d752cf377299c47200959b486f93f1c8eb60e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: convert parameter type and removed casting
Changed paths:
engines/twine/interface.cpp
engines/twine/interface.h
diff --git a/engines/twine/interface.cpp b/engines/twine/interface.cpp
index c5c7cca738..00975c0c18 100644
--- a/engines/twine/interface.cpp
+++ b/engines/twine/interface.cpp
@@ -50,8 +50,8 @@ int32 Interface::checkClipping(int32 x, int32 y) {
}
// TODO: check if Graphics::drawLine() works here
-void Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, int32 endHeight, int32 lineColor) {
- int32 currentLineColor = lineColor;
+void Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, int32 endHeight, uint8 lineColor) {
+ uint8 currentLineColor = lineColor;
// draw line from left to right
if (startWidth > endWidth) {
@@ -114,7 +114,7 @@ void Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, in
uint8 *out = (uint8*)_engine->frontVideoBuffer.getBasePtr(startWidth, startHeight);
- int16 color = currentLineColor;
+ uint8 color = currentLineColor;
if (endWidth < endHeight) { // significant slope
int16 xchg = endWidth;
endWidth = endHeight;
@@ -125,7 +125,7 @@ void Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, in
endHeight <<= 1;
endWidth++;
do {
- *out = (uint8)color;
+ *out = color;
startHeight -= endHeight;
if (startHeight > 0) {
out += flag2;
@@ -141,7 +141,7 @@ void Interface::drawLine(int32 startWidth, int32 startHeight, int32 endWidth, in
endHeight <<= 1;
endWidth++;
do {
- *out = (uint8)color;
+ *out = color;
out++;
startHeight -= endHeight;
if (startHeight < 0) {
diff --git a/engines/twine/interface.h b/engines/twine/interface.h
index 3d43a5411d..ae2eba62cb 100644
--- a/engines/twine/interface.h
+++ b/engines/twine/interface.h
@@ -64,7 +64,7 @@ public:
* @param endHeight height value where the line ends
* @param lineColor line color in the current palette
*/
- void drawLine(int32 startWidth, int32 startHeight, int32 endWidth, int32 endHeight, int32 lineColor);
+ void drawLine(int32 startWidth, int32 startHeight, int32 endWidth, int32 endHeight, uint8 lineColor);
/**
* Blit button box from working buffer to front buffer
Commit: 808a8712b73dea2b96700214173826646959ef79
https://github.com/scummvm/scummvm/commit/808a8712b73dea2b96700214173826646959ef79
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: code cleanup
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index fa0593fdbb..f84df78452 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1225,11 +1225,11 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
const int32 point1 = line.p1 / 6;
const int32 point2 = line.p2 / 6;
const int32 param = line.data;
- *((int32 *)&lineCoordinatesPtr->data) = param;
- *((int16 *)&lineCoordinatesPtr->x1) = flattenPoints[point1].x;
- *((int16 *)&lineCoordinatesPtr->y1) = flattenPoints[point1].y;
- *((int16 *)&lineCoordinatesPtr->x2) = flattenPoints[point2].x;
- *((int16 *)&lineCoordinatesPtr->y2) = flattenPoints[point2].y;
+ lineCoordinatesPtr->data = param;
+ lineCoordinatesPtr->x1 = flattenPoints[point1].x;
+ lineCoordinatesPtr->y1 = flattenPoints[point1].y;
+ lineCoordinatesPtr->x2 = flattenPoints[point2].x;
+ lineCoordinatesPtr->y2 = flattenPoints[point2].y;
bestDepth = flattenPoints[point1].z;
int32 depth = flattenPoints[point2].z;
@@ -1313,12 +1313,12 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
switch (type) {
case RENDERTYPE_DRAWLINE: { // draw a line
const lineCoordinates *lineCoordinatesPtr = (const lineCoordinates *)pointer;
- int16 color = (*((const int32 *)&lineCoordinatesPtr->data) & 0xFF00) >> 8;
+ int16 color = (lineCoordinatesPtr->data & 0xFF00) >> 8;
- const int32 x1 = *((const int16 *)&lineCoordinatesPtr->x1);
- const int32 y1 = *((const int16 *)&lineCoordinatesPtr->y1);
- const int32 x2 = *((const int16 *)&lineCoordinatesPtr->x2);
- const int32 y2 = *((const int16 *)&lineCoordinatesPtr->y2);
+ const int32 x1 = lineCoordinatesPtr->x1;
+ const int32 y1 = lineCoordinatesPtr->y1;
+ const int32 x2 = lineCoordinatesPtr->x2;
+ const int32 y2 = lineCoordinatesPtr->y2;
_engine->_interface->drawLine(x1, y1, x2, y2, color);
break;
Commit: f251a088d59b5433e474a8ac475b7772934f8606
https://github.com/scummvm/scummvm/commit/f251a088d59b5433e474a8ac475b7772934f8606
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: cleanup model data parsing
Changed paths:
engines/twine/renderer.cpp
engines/twine/renderer.h
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index f84df78452..cee3c24018 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1005,7 +1005,7 @@ void Renderer::renderPolygons(const polyHeader &polyHeader) {
renderPolygons(polyHeader.renderType, polyHeader.colorIndex, vleft, vright, vtop, vbottom);
}
-void Renderer::circleFill(int32 x, int32 y, int32 radius, int8 color) {
+void Renderer::circleFill(int32 x, int32 y, int32 radius, uint8 color) {
radius += 1;
for (int32 currentLine = -radius; currentLine <= radius; currentLine++) {
@@ -1027,7 +1027,7 @@ void Renderer::circleFill(int32 x, int32 y, int32 radius, int8 color) {
}
}
-int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, renderTabEntry **renderTabEntryPtr) {
+int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTabEntry **renderTabEntryPtr) {
int32 bestDepth;
int32 currentDepth;
int32 bestPoly = 0;
@@ -1036,7 +1036,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
// prepare polygons
// TODO: proper size
- Common::MemoryReadStream stream(pointer, 100000);
+ Common::MemoryReadStream stream(ptr, 100000);
int16 numPolygons = stream.readSint16LE();
uint8 *edi = renderTab7; // renderTab7 coordinates buffer
@@ -1213,9 +1213,10 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
numOfPrimitives += temp;
do {
lineData line;
- line.data = stream.readSint32LE();
- line.p1 = stream.readSint16LE();;
- line.p2 = stream.readSint16LE();;
+ line.colorIndex = stream.readByte();
+ stream.skip(3);
+ line.p1 = stream.readSint16LE();
+ line.p2 = stream.readSint16LE();
lineCoordinates *lineCoordinatesPtr = (lineCoordinates *)edi;
if (line.p1 % 6 != 0 || line.p2 % 6 != 0) {
@@ -1224,8 +1225,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
const int32 point1 = line.p1 / 6;
const int32 point2 = line.p2 / 6;
- const int32 param = line.data;
- lineCoordinatesPtr->data = param;
+ lineCoordinatesPtr->colorIndex = line.colorIndex;
lineCoordinatesPtr->x1 = flattenPoints[point1].x;
lineCoordinatesPtr->y1 = flattenPoints[point1].y;
lineCoordinatesPtr->x2 = flattenPoints[point2].x;
@@ -1303,46 +1303,46 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
}
int16 primitiveCounter = numOfPrimitives;
- renderV19 = pointer + stream.pos();
+ renderV19 = ptr + stream.pos();
do {
int16 type = renderTabEntryPtr2->renderType;
- pointer = renderTabEntryPtr2->dataPtr;
+ uint8 *pointer = renderTabEntryPtr2->dataPtr;
renderV19 += 8;
switch (type) {
case RENDERTYPE_DRAWLINE: { // draw a line
- const lineCoordinates *lineCoordinatesPtr = (const lineCoordinates *)pointer;
- int16 color = (lineCoordinatesPtr->data & 0xFF00) >> 8;
-
- const int32 x1 = lineCoordinatesPtr->x1;
- const int32 y1 = lineCoordinatesPtr->y1;
- const int32 x2 = lineCoordinatesPtr->x2;
- const int32 y2 = lineCoordinatesPtr->y2;
-
- _engine->_interface->drawLine(x1, y1, x2, y2, color);
+ Common::MemoryReadStream typeStream(pointer, 12);
+ lineCoordinates lineCoords;
+ lineCoords.colorIndex = typeStream.readByte();
+ typeStream.skip(3);
+ lineCoords.x1 = typeStream.readSint16LE();
+ lineCoords.y1 = typeStream.readSint16LE();
+ lineCoords.x2 = typeStream.readSint16LE();
+ lineCoords.y2 = typeStream.readSint16LE();
+ const int32 x1 = lineCoords.x1;
+ const int32 y1 = lineCoords.y1;
+ const int32 x2 = lineCoords.x2;
+ const int32 y2 = lineCoords.y2;
+ _engine->_interface->drawLine(x1, y1, x2, y2, lineCoords.colorIndex);
break;
}
case RENDERTYPE_DRAWPOLYGON: { // draw a polygon
- int32 eax = *((const int *)pointer);
- pointer += 4;
-
- int16 polyRenderType = eax & 0xFF;
- uint8 numOfVertex = (eax & 0xFF00) >> 8;
- int16 color = (eax & 0xFF0000) >> 16;
+ // TODO: size
+ Common::MemoryReadStream typeStream(pointer, 10000);
+ polyHeader polyHeader;
+ polyHeader.renderType = typeStream.readByte();
+ polyHeader.numOfVertex = typeStream.readByte();
+ polyHeader.colorIndex = typeStream.readByte();
+ typeStream.skip(1);
uint8 *destPtr = (uint8 *)vertexCoordinates;
- const int32 triangleCount = numOfVertex * 3;
+ const int32 triangleCount = polyHeader.numOfVertex * 3;
for (int32 i = 0; i < triangleCount; i++) {
- *((int16 *)destPtr) = *((const int16 *)pointer);
+ *((int16 *)destPtr) = typeStream.readSint16LE();
destPtr += 2;
- pointer += 2;
}
- polyHeader polyHeader;
- polyHeader.renderType = polyRenderType;
- polyHeader.numOfVertex = numOfVertex;
- polyHeader.colorIndex = color;
renderPolygons(polyHeader);
break;
}
@@ -1385,7 +1385,6 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *pointer, rende
break;
}
- pointer = renderV19;
renderTabEntryPtr2++;
} while (--primitiveCounter);
return 0;
diff --git a/engines/twine/renderer.h b/engines/twine/renderer.h
index 009f48cdc6..5db653c14c 100644
--- a/engines/twine/renderer.h
+++ b/engines/twine/renderer.h
@@ -86,7 +86,10 @@ private:
static_assert(sizeof(elementEntry) == 38, "Unexpected elementEntry size");
struct lineCoordinates {
- int32 data = 0;
+ uint8 colorIndex = 0;
+ uint8 unk1 = 0;
+ uint8 unk2 = 0;
+ uint8 unk3 = 0;
int16 x1 = 0;
int16 y1 = 0;
int16 x2 = 0;
@@ -94,7 +97,10 @@ private:
};
struct lineData {
- int32 data = 0;
+ uint8 colorIndex = 0;
+ uint8 unk1 = 0;
+ uint8 unk2 = 0;
+ uint8 unk3 = 0;
int16 p1 = 0;
int16 p2 = 0;
};
@@ -138,7 +144,7 @@ private:
};
int32 renderAnimatedModel(uint8 *bodyPtr, renderTabEntry *renderTabEntryPtr);
- void circleFill(int32 x, int32 y, int32 radius, int8 color);
+ void circleFill(int32 x, int32 y, int32 radius, uint8 color);
int32 renderModelElements(int32 numOfPrimitives, uint8 *pointer, renderTabEntry** renderTabEntryPtr);
void getBaseRotationPosition(int32 x, int32 y, int32 z);
void getCameraAnglePositions(int32 x, int32 y, int32 z);
Commit: a81e496b7e56f252344d24a05b830de51ca81cb5
https://github.com/scummvm/scummvm/commit/a81e496b7e56f252344d24a05b830de51ca81cb5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: cleanup in Renderer::circleFill
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index cee3c24018..aff88c806a 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1012,15 +1012,9 @@ void Renderer::circleFill(int32 x, int32 y, int32 radius, uint8 color) {
double width;
if (ABS(currentLine) != radius) {
- width = sin(acos((float)currentLine / (float)radius));
+ width = ABS(sin(acos((float)currentLine / (float)radius)) * radius);
} else {
- width = 0;
- }
-
- width *= radius;
-
- if (width < 0) {
- width = -width;
+ width = 0.0;
}
_engine->_interface->drawLine((int32)(x - width), currentLine + y, (int32)(x + width), currentLine + y, color);
Commit: a637786183e1f282b5519192e2ac6a1678ab60e5
https://github.com/scummvm/scummvm/commit/a637786183e1f282b5519192e2ac6a1678ab60e5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: removed dead code
the if branch was never reached, as currentDepth was 1 everytime
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index aff88c806a..41a1a59097 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1172,7 +1172,6 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
ax *= bx;
bestDepth = ax;
- bx = currentDepth;
ax = *((const int16 *)(edi + 2));
int16 cx = *((const int16 *)(edi + 10));
@@ -1181,22 +1180,17 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
cx -= *((const int16 *)(edi + 4));
ax *= cx;
-
ax -= bestDepth;
- currentDepth -= (bx)-1; // peut-etre une erreur la
- if (currentDepth < 0) {
- edi = render23;
- } else {
- numOfPrimitives++;
+ currentDepth = 1;
+ numOfPrimitives++;
- (*renderTabEntryPtr)->depth = render25;
- (*renderTabEntryPtr)->renderType = 1;
- (*renderTabEntryPtr)->dataPtr = render23;
- (*renderTabEntryPtr)++;
+ (*renderTabEntryPtr)->depth = render25;
+ (*renderTabEntryPtr)->renderType = 1;
+ (*renderTabEntryPtr)->dataPtr = render23;
+ (*renderTabEntryPtr)++;
- edi = render24;
- }
+ edi = render24;
} while (--primitiveCounter);
}
Commit: 2b20f54310889f9fa0ab436daf802fcd13817b33
https://github.com/scummvm/scummvm/commit/2b20f54310889f9fa0ab436daf802fcd13817b33
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: reduced scope in renderer code
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index 41a1a59097..01b0f81acd 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1022,8 +1022,6 @@ void Renderer::circleFill(int32 x, int32 y, int32 radius, uint8 color) {
}
int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTabEntry **renderTabEntryPtr) {
- int32 bestDepth;
- int32 currentDepth;
int32 bestPoly = 0;
// int32 ecx;
@@ -1035,7 +1033,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
uint8 *edi = renderTab7; // renderTab7 coordinates buffer
- uint8 *renderV19 = nullptr; // RECHECK THIS
+ uint8 *afterPolyHeaderPtr = nullptr; // RECHECK THIS
if (numPolygons > 0) {
int16 primitiveCounter = numPolygons; // the number of primitives = the number of polygons
@@ -1048,6 +1046,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
currentPolyHeader.colorIndex = stream.readSint16LE();
//ecx = *((int32*) pointer);
int16 polyRenderType = currentPolyHeader.renderType;
+ int32 bestDepth = -32000;
// TODO: RECHECK coordinates axis
if (polyRenderType >= 9) {
@@ -1061,8 +1060,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
int16 counter = destinationHeader->numOfVertex;
- bestDepth = -32000;
- renderV19 = edi;
+ afterPolyHeaderPtr = edi;
do {
polyVertexHeader currentPolyVertex;
@@ -1083,8 +1081,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
edi += sizeof(pointTab);
- currentDepth = currentVertex->z;
-
+ int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
@@ -1102,8 +1099,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
*((int16 *)(edi + 2)) = color + shadeTable[shadeEntry];
edi += 4;
- renderV19 = edi;
- bestDepth = -32000;
+ afterPolyHeaderPtr = edi;
int16 counter = destinationHeader->numOfVertex;
do {
@@ -1118,8 +1114,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
edi += sizeof(pointTab);
- currentDepth = currentVertex->z;
-
+ int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
@@ -1133,8 +1128,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
edi += 4;
- bestDepth = -32000;
- renderV19 = edi;
+ afterPolyHeaderPtr = edi;
int32 eax = 0;
int16 counter = currentPolyHeader.numOfVertex;
@@ -1150,47 +1144,38 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
edi += sizeof(pointTab);
- currentDepth = currentVertex->z;
-
+ int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
bestDepth = currentDepth;
}
} while (--counter > 0);
}
- uint8 *render24 = edi;
- edi = renderV19;
-
- int32 render25 = bestDepth;
+ int16 ax = *((const int16 *)(afterPolyHeaderPtr + 4));
+ int16 bx = *((const int16 *)(afterPolyHeaderPtr + 8));
- int16 ax = *((const int16 *)(edi + 4));
- int16 bx = *((const int16 *)(edi + 8));
-
- ax -= *((const int16 *)(edi + 16));
- bx -= *((const int16 *)(edi + 2));
+ ax -= *((const int16 *)(afterPolyHeaderPtr + 16));
+ bx -= *((const int16 *)(afterPolyHeaderPtr + 2));
ax *= bx;
- bestDepth = ax;
+ int32 bestDepth2 = ax;
- ax = *((const int16 *)(edi + 2));
- int16 cx = *((const int16 *)(edi + 10));
+ ax = *((const int16 *)(afterPolyHeaderPtr + 2));
+ int16 cx = *((const int16 *)(afterPolyHeaderPtr + 10));
- ax -= *((const int16 *)(edi + 14));
- cx -= *((const int16 *)(edi + 4));
+ ax -= *((const int16 *)(afterPolyHeaderPtr + 14));
+ cx -= *((const int16 *)(afterPolyHeaderPtr + 4));
ax *= cx;
- ax -= bestDepth;
+ ax -= bestDepth2;
- currentDepth = 1;
numOfPrimitives++;
- (*renderTabEntryPtr)->depth = render25;
+ (*renderTabEntryPtr)->depth = bestDepth;
(*renderTabEntryPtr)->renderType = 1;
(*renderTabEntryPtr)->dataPtr = render23;
(*renderTabEntryPtr)++;
-
- edi = render24;
} while (--primitiveCounter);
}
@@ -1218,7 +1203,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
lineCoordinatesPtr->y1 = flattenPoints[point1].y;
lineCoordinatesPtr->x2 = flattenPoints[point2].x;
lineCoordinatesPtr->y2 = flattenPoints[point2].y;
- bestDepth = flattenPoints[point1].z;
+ int32 bestDepth = flattenPoints[point1].z;
int32 depth = flattenPoints[point2].z;
if (depth >= bestDepth) {
@@ -1291,12 +1276,12 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
}
int16 primitiveCounter = numOfPrimitives;
- renderV19 = ptr + stream.pos();
+ afterPolyHeaderPtr = ptr + stream.pos();
do {
int16 type = renderTabEntryPtr2->renderType;
uint8 *pointer = renderTabEntryPtr2->dataPtr;
- renderV19 += 8;
+ afterPolyHeaderPtr += 8;
switch (type) {
case RENDERTYPE_DRAWLINE: { // draw a line
Commit: 61d49da3804c376b8c427996212bcd8a189761a2
https://github.com/scummvm/scummvm/commit/61d49da3804c376b8c427996212bcd8a189761a2
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:44+01:00
Commit Message:
TWINE: reduced scope in renderer code
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index 01b0f81acd..6b7269ef95 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1022,11 +1022,6 @@ void Renderer::circleFill(int32 x, int32 y, int32 radius, uint8 color) {
}
int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTabEntry **renderTabEntryPtr) {
- int32 bestPoly = 0;
- // int32 ecx;
-
- // prepare polygons
-
// TODO: proper size
Common::MemoryReadStream stream(ptr, 100000);
int16 numPolygons = stream.readSint16LE();
@@ -1044,7 +1039,6 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
currentPolyHeader.renderType = stream.readByte();
currentPolyHeader.numOfVertex = stream.readByte();
currentPolyHeader.colorIndex = stream.readSint16LE();
- //ecx = *((int32*) pointer);
int16 polyRenderType = currentPolyHeader.renderType;
int32 bestDepth = -32000;
@@ -1247,6 +1241,7 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
const renderTabEntry *renderTabEntryPtr2 = renderTab;
renderTabEntry *renderTabSortedPtr = renderTabSorted;
+ int32 bestPoly = 0;
for (int32 i = 0; i < numOfPrimitives; i++) { // then we sort the polygones | WARNING: very slow | TODO: improve this
renderTabEntryPtr2 = renderTab;
int16 bestZ = -0x7FFF;
Commit: 1d624d2e1f80a6d0f7835a4c364ce975ece27bc3
https://github.com/scummvm/scummvm/commit/1d624d2e1f80a6d0f7835a4c364ce975ece27bc3
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-28T01:09:45+01:00
Commit Message:
TWINE: cleanup in Renderer::renderModelElements
Changed paths:
engines/twine/renderer.cpp
diff --git a/engines/twine/renderer.cpp b/engines/twine/renderer.cpp
index 6b7269ef95..0dd94afc7e 100644
--- a/engines/twine/renderer.cpp
+++ b/engines/twine/renderer.cpp
@@ -1068,12 +1068,11 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
currentComputedVertex->shadeValue = shadeValue;
pointTab *currentVertex = &flattenPoints[currentPolyVertex.dataOffset / sizeof(pointTab)];
- pointTab *destinationVertex = (pointTab *)(edi + 2);
- destinationVertex->x = currentVertex->x;
- destinationVertex->y = currentVertex->y;
+ currentComputedVertex->x = currentVertex->x;
+ currentComputedVertex->y = currentVertex->y;
- edi += sizeof(pointTab);
+ edi += 6;
int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
@@ -1085,12 +1084,9 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
destinationHeader->renderType = currentPolyHeader.renderType - 7;
destinationHeader->numOfVertex = currentPolyHeader.numOfVertex;
-
- int16 color = currentPolyHeader.colorIndex;
-
- int16 shadeEntry = stream.readSint16LE();
-
- *((int16 *)(edi + 2)) = color + shadeTable[shadeEntry];
+ const int16 shadeEntry = stream.readSint16LE();
+ const int16 shadeValue = currentPolyHeader.colorIndex + shadeTable[shadeEntry];
+ destinationHeader->colorIndex = shadeValue;
edi += 4;
afterPolyHeaderPtr = edi;
@@ -1101,12 +1097,12 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
- pointTab *destinationVertex = (pointTab *)(edi + 2);
-
- destinationVertex->x = currentVertex->x;
- destinationVertex->y = currentVertex->y;
+ computedVertex *currentComputedVertex = (computedVertex *)edi;
+ //currentComputedVertex->shadeValue = 0;
+ currentComputedVertex->x = currentVertex->x;
+ currentComputedVertex->y = currentVertex->y;
- edi += sizeof(pointTab);
+ edi += 6;
int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
@@ -1131,12 +1127,12 @@ int32 Renderer::renderModelElements(int32 numOfPrimitives, uint8 *ptr, renderTab
pointTab *currentVertex = &flattenPoints[eax / sizeof(pointTab)];
- pointTab *destinationVertex = (pointTab *)(edi + 2);
-
- destinationVertex->x = currentVertex->x;
- destinationVertex->y = currentVertex->y;
+ computedVertex *currentComputedVertex = (computedVertex *)edi;
+ //currentComputedVertex->shadeValue = 0;
+ currentComputedVertex->x = currentVertex->x;
+ currentComputedVertex->y = currentVertex->y;
- edi += sizeof(pointTab);
+ edi += 6;
int32 currentDepth = currentVertex->z;
if (currentDepth > bestDepth) {
More information about the Scummvm-git-logs
mailing list