Skip to content

[glrend] BR_MATF_QUAD_MAPPING support #49

@vs49688

Description

@vs49688

Can't strictly be done in the shader, requires duplicating vertices CPU-side.

Probably not worth the effort implementing as nothing uses it, but tracking this for posterity.

Example with rdemo, with:

    mirror_mat = CreateMaterial("mirror");
    //mirror_mat->flags |= BR_MATF_ENVIRONMENT_L;
    mirror_mat->flags |= BR_MATF_QUAD_MAPPING;
    mirror_mat->colour_map = ref->mirror_pm;
    BrMaterialAdd(mirror_mat);
Image

Relevant softrend code in mapping.c:

void BR_ASM_CALL OpTriangleMapQuad(brp_block *block, brp_vertex *v0, brp_vertex *v1, brp_vertex *v2, br_uint_16 (*fp_vertices)[3],
                                   br_uint_16 (*fp_edges)[3], br_vector4 *fp_eqn, struct temp_face *tfp)
{
    br_vector2 *qv = (br_vector2 *)&rend.renderer->state.cache.quad_transformed;

    switch(rend.face_flags[rend.current_index] & BR_FACEF_QUAD_MASK) {

        case BR_FACEF_QUAD_012:

            v0->comp[C_U] = qv[0].v[0];
            v0->comp[C_V] = qv[0].v[1];
            v1->comp[C_U] = qv[1].v[0];
            v1->comp[C_V] = qv[1].v[1];
            v2->comp[C_U] = qv[2].v[0];
            v2->comp[C_V] = qv[2].v[1];
            break;

        case BR_FACEF_QUAD_123:

            v0->comp[C_U] = qv[1].v[0];
            v0->comp[C_V] = qv[1].v[1];
            v1->comp[C_U] = qv[2].v[0];
            v1->comp[C_V] = qv[2].v[1];
            v2->comp[C_U] = qv[3].v[0];
            v2->comp[C_V] = qv[3].v[1];
            break;

        case BR_FACEF_QUAD_230:

            v0->comp[C_U] = qv[2].v[0];
            v0->comp[C_V] = qv[2].v[1];
            v1->comp[C_U] = qv[3].v[0];
            v1->comp[C_V] = qv[3].v[1];
            v2->comp[C_U] = qv[0].v[0];
            v2->comp[C_V] = qv[0].v[1];
            break;

        case BR_FACEF_QUAD_301:

            v0->comp[C_U] = qv[3].v[0];
            v0->comp[C_V] = qv[3].v[1];
            v1->comp[C_U] = qv[0].v[0];
            v1->comp[C_V] = qv[0].v[1];
            v2->comp[C_U] = qv[1].v[0];
            v2->comp[C_V] = qv[1].v[1];
            break;

        case BR_FACEF_QUAD_032:

            v0->comp[C_U] = qv[0].v[0];
            v0->comp[C_V] = qv[0].v[1];
            v1->comp[C_U] = qv[3].v[0];
            v1->comp[C_V] = qv[3].v[1];
            v2->comp[C_U] = qv[2].v[0];
            v2->comp[C_V] = qv[2].v[1];
            break;

        case BR_FACEF_QUAD_103:

            v0->comp[C_U] = qv[1].v[0];
            v0->comp[C_V] = qv[1].v[1];
            v1->comp[C_U] = qv[0].v[0];
            v1->comp[C_V] = qv[0].v[1];
            v2->comp[C_U] = qv[3].v[0];
            v2->comp[C_V] = qv[3].v[1];
            break;

        case BR_FACEF_QUAD_210:

            v0->comp[C_U] = qv[2].v[0];
            v0->comp[C_V] = qv[2].v[1];
            v1->comp[C_U] = qv[1].v[0];
            v1->comp[C_V] = qv[1].v[1];
            v2->comp[C_U] = qv[0].v[0];
            v2->comp[C_V] = qv[0].v[1];
            break;

        case BR_FACEF_QUAD_321:

            v0->comp[C_U] = qv[3].v[0];
            v0->comp[C_V] = qv[3].v[1];
            v1->comp[C_U] = qv[2].v[0];
            v1->comp[C_V] = qv[2].v[1];
            v2->comp[C_U] = qv[1].v[0];
            v2->comp[C_V] = qv[1].v[1];
            break;
    }

    block->chain->render(block->chain, v0, v1, v2, fp_vertices, fp_edges, fp_eqn, tfp);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    glrendOpenGL Renderer

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions