diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp index 0c55fd1b0d3..dd9a1b933e5 100644 --- a/engines/twine/renderer/renderer.cpp +++ b/engines/twine/renderer/renderer.cpp @@ -49,6 +49,10 @@ void Renderer::init(int32 w, int32 h) { _polyTabSize = _engine->height() * 6; _polyTab = (int16 *)malloc(_polyTabSize * sizeof(int16)); _colorProgressionBuffer = (int16 *)malloc(_polyTabSize * sizeof(int16)); + + memset(_polyTab, 0, sizeof(_polyTabSize * sizeof(int16))); + memset(_colorProgressionBuffer, 0, sizeof(_polyTabSize * sizeof(int16))); + _tabVerticG = &_polyTab[_engine->height() * 0]; _tabVerticD = &_polyTab[_engine->height() * 1]; _tabx0 = &_polyTab[_engine->height() * 2]; @@ -600,7 +604,7 @@ int16 Renderer::bottomClip(int16 polyRenderType, ComputedVertex** offTabPoly, in return newNbPoints; } -int32 Renderer::computePolyMinMax(int16 polyRenderType, ComputedVertex **offTabPoly, int32 numVertices) { +int32 Renderer::computePolyMinMax(int16 polyRenderType, ComputedVertex **offTabPoly, int32 numVertices, int &vtop, int &vbottom) { const Common::Rect &clip = _engine->_interface->_clip; if (clip.isEmpty()) { return numVertices; @@ -693,10 +697,13 @@ int32 Renderer::computePolyMinMax(int16 polyRenderType, ComputedVertex **offTabP } } + vtop = minsy; + vbottom = maxsy; + return clippedNumVertices; } -bool Renderer::computePoly(int16 polyRenderType, const ComputedVertex *vertices, int32 numVertices) { +bool Renderer::computePoly(int16 polyRenderType, const ComputedVertex *vertices, int32 numVertices, int &vtop, int &vbottom) { const int16 *polyTabBegin = _polyTab; const int16 *polyTabEnd = &_polyTab[_polyTabSize - 1]; const int16 *colProgressBufStart = _colorProgressionBuffer; @@ -710,7 +717,7 @@ bool Renderer::computePoly(int16 polyRenderType, const ComputedVertex *vertices, ComputedVertex *offTabPoly[] = {_clippedPolygonVertices1, _clippedPolygonVertices2}; - numVertices = computePolyMinMax(polyRenderType, offTabPoly, numVertices); + numVertices = computePolyMinMax(polyRenderType, offTabPoly, numVertices, vtop, vbottom); if (numVertices == 0) { return false; } @@ -1282,7 +1289,7 @@ void Renderer::svgaPolyTriche(int vtop, int32 vsize, uint16 color) const { } void Renderer::renderPolygons(const CmdRenderPolygon &polygon, ComputedVertex *vertices, int vtop, int vbottom) { - if (computePoly(polygon.renderType, vertices, polygon.numVertices)) { + if (computePoly(polygon.renderType, vertices, polygon.numVertices, vtop, vbottom)) { const int32 vsize = vbottom - vtop + 1; fillVertices(vtop, vsize, polygon.renderType, polygon.colorIndex); } @@ -1337,7 +1344,7 @@ void Renderer::fillVertices(int vtop, int32 vsize, uint8 renderType, uint16 colo } } -bool Renderer::computeSphere(int32 x, int32 y, int32 radius) { +bool Renderer::computeSphere(int32 x, int32 y, int32 radius, int &vtop, int &vbottom) { if (radius <= 0) { return false; } @@ -1427,6 +1434,9 @@ bool Renderer::computeSphere(int32 x, int32 y, int32 radius) { ++r; } + vtop = top; + vbottom = bottom; + return true; } @@ -1633,8 +1643,10 @@ bool Renderer::renderModelElements(int32 numOfPrimitives, const BodyData &bodyDa radius -= 3; - if (computeSphere(sphere->x, sphere->y, radius)) { - const int32 vsize = 2 * radius; + int vtop = -1; + int vbottom = -1; + if (computeSphere(sphere->x, sphere->y, radius, vtop, vbottom)) { + const int32 vsize = vbottom - vtop; fillVertices(sphere->y - radius, vsize, sphere->polyRenderType, sphere->color); } break; diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h index 0e0e1a3c5a6..e8304c464f6 100644 --- a/engines/twine/renderer/renderer.h +++ b/engines/twine/renderer/renderer.h @@ -152,7 +152,7 @@ private: ModelData _modelData; bool renderAnimatedModel(ModelData *modelData, const BodyData &bodyData, RenderCommand *renderCmds, const IVec3 &angleVec, const IVec3 &renderPos, Common::Rect &modelRect); - bool computeSphere(int32 x, int32 y, int32 radius); + bool computeSphere(int32 x, int32 y, int32 radius, int &vtop, int &vbottom); bool renderModelElements(int32 numOfPrimitives, const BodyData &bodyData, RenderCommand **renderCmds, ModelData *modelData, Common::Rect &modelRect); IVec3 longInverseRot(int32 x, int32 y, int32 z); inline IVec3 getCameraAnglePositions(const IVec3 &vec) { @@ -208,7 +208,7 @@ private: void svgaPolyDith(int vtop, int32 vsize) const; void svgaPolyMarbre(int vtop, int32 vsize, uint16 color) const; void svgaPolyTriche(int vtop, int32 vsize, uint16 color) const; - bool computePoly(int16 polyRenderType, const ComputedVertex *vertices, int32 numVertices); + bool computePoly(int16 polyRenderType, const ComputedVertex *vertices, int32 numVertices, int &vtop, int &vbottom); const RenderCommand *depthSortRenderCommands(int32 numOfPrimitives); uint8 *preparePolygons(const Common::Array& polygons, int32 &numOfPrimitives, RenderCommand **renderCmds, uint8 *renderBufferPtr, ModelData *modelData); @@ -225,7 +225,7 @@ private: int16 rightClip(int16 polyRenderType, ComputedVertex** offTabPoly, int32 numVertices); int16 topClip(int16 polyRenderType, ComputedVertex** offTabPoly, int32 numVertices); int16 bottomClip(int16 polyRenderType, ComputedVertex** offTabPoly, int32 numVertices); - int32 computePolyMinMax(int16 polyRenderType, ComputedVertex **offTabPoly, int32 numVertices); + int32 computePolyMinMax(int16 polyRenderType, ComputedVertex **offTabPoly, int32 numVertices, int &vtop, int &vbottom); public: Renderer(TwinEEngine *engine); ~Renderer();