Opened 4 months ago

Last modified 5 days ago

#15272 new defect

TINYGL: triangle fan produces less triangles than expected?

Reported by: neuromancer Owned by:
Priority: normal Component: Graphics
Version: Keywords: tinygl
Cc: Game:

Description

TGL_TRIANGLE_FAN seems to produce less triangles than expected. Check the screenshots associated, where similar code is for TinyGL and OpenGL implementation. The code is basically this one:

void TinyGLRenderer::drawCelestialBody(Math::Vector3d position, float radius, byte color) {
    uint8 r1, g1, b1, r2, g2, b2;
    byte *stipple = nullptr;
    getRGBAt(color, 0, r1, g1, b1, r2, g2, b2, stipple);

    int triangleAmount = 20;
    float twicePi = (float)(2.0 * M_PI);
    ...

    tglDisable(TGL_DEPTH_TEST);
    tglDepthMask(TGL_FALSE);

    setStippleData(stipple);
    useColor(r1, g1, b1);

    tglEnableClientState(TGL_VERTEX_ARRAY);
    copyToVertexArray(0, position);
    float adj = 1.25; // Perspective correction

    for(int i = 0; i <= triangleAmount; i++) {
        copyToVertexArray(i + 1,
            Math::Vector3d(position.x(), position.y() + (radius * cos(i *  twicePi / triangleAmount)),
                        position.z() + (adj * radius * sin(i * twicePi / triangleAmount)))
        );
    }

    tglVertexPointer(3, TGL_FLOAT, 0, _verts);
    tglDrawArrays(TGL_TRIANGLE_FAN, 0, triangleAmount + 2);
    tglDisableClientState(TGL_VERTEX_ARRAY);
}

I'm also seeing a bunch of sanitizer warning/errors when rendering this, perhaps they are related:

graphics/tinygl/ztriangle.cpp:418:19: runtime error: left shift of negative value -5
graphics/tinygl/ztriangle.cpp:362:16: runtime error: left shift of negative value -10
graphics/tinygl/clip.cpp:251:58: runtime error: signed integer overflow: -2147483648 - 43 cannot be represented in type 'int'
graphics/tinygl/clip.cpp:252:24: runtime error: signed integer overflow: -2147483648 - 185 cannot be represented in type 'int'
graphics/tinygl/ztriangle.cpp:212:23: runtime error: signed integer overflow: 185 - -2147483648 cannot be represented in type 'int'
graphics/tinygl/ztriangle.cpp:213:23: runtime error: signed integer overflow: 32 - -2147483648 cannot be represented in type 'int'
graphics/tinygl/ztriangle.cpp:215:23: runtime error: signed integer overflow: 185 - -2147483648 cannot be represented in type 'int'
graphics/tinygl/ztriangle.cpp:216:23: runtime error: signed integer overflow: 43 - -2147483648 cannot be represented in type 'int'
graphics/tinygl/ztriangle.cpp:362:16: runtime error: left shift of negative value -102
graphics/tinygl/ztriangle.cpp:418:19: runtime error: left shift of negative value -102
graphics/tinygl/clip.cpp:251:27: runtime error: signed integer overflow: -2147483648 - 159 cannot be represented in type 'int'
graphics/tinygl/clip.cpp:252:55: runtime error: signed integer overflow: -2147483648 - 32 cannot be represented in type 'int'

Attachments (2)

scummvm-totaleclipse-1-00000.webp (75.3 KB ) - added by neuromancer 4 months ago.
scummvm-totaleclipse-00000.webp (43.4 KB ) - added by neuromancer 4 months ago.

Download all attachments as: .zip

Change History (4)

by neuromancer, 4 months ago

by neuromancer, 4 months ago

comment:1 by neuromancer, 4 months ago

Summary: TINY: triangle fan produces less triangles than expected?TINYGL: triangle fan produces less triangles than expected?

comment:2 by neuromancer, 5 days ago

I started to dig into this issue. On thing that is happening is that the -infinity value (e.g. -2147483648 or 0x80000000) is introduced here:

void GLContext::gl_transform_to_viewport(GLVertex *v) {
	float winv;

	// coordinates
	winv = (float)(1.0 / v->pc.W);
	v->zp.x = (int)(v->pc.X * winv * viewport.scale.X + viewport.trans.X);
	v->zp.y = (int)(v->pc.Y * winv * viewport.scale.Y + viewport.trans.Y);
	v->zp.z = (int)(v->pc.Z * winv * viewport.scale.Z + viewport.trans.Z);

Either v->pc.W is very close (or equal) to zero, or the computation of the zbuffer components results in very large numbers that gets casted into -infinity.

I'm not sure if this is the cause or a symptom of a larger problem.

Note: See TracTickets for help on using tickets.