[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