void CBitmap::OglRender (tRgbaColorf* colorP, int nColors, int orient)
{
	float				verts [4][2] = {{m_render.x0, m_render.y0}, {m_render.x1, m_render.y0}, {m_render.x1, m_render.y1}, {m_render.x0, m_render.y1}};
	tTexCoord2f		texCoord [4];

SetTexCoord (m_render.u1, m_render.v1, orient, texCoord [0]);
SetTexCoord (m_render.u2, m_render.v1, orient, texCoord [1]);
SetTexCoord (m_render.u2, m_render.v2, orient, texCoord [2]);
SetTexCoord (m_render.u1, m_render.v2, orient, texCoord [3]);
ogl.EnableClientStates (1, (nColors == 4), 0, GL_TEXTURE0);
glTexCoordPointer (2, GL_FLOAT, sizeof (tTexCoord2f), texCoord);
if (nColors == 4)
	OglColorPointer (4, GL_FLOAT, sizeof (tRgbaColorf), colorP);
else
	glColor4fv (reinterpret_cast<GLfloat*> (colorP));
OglVertexPointer (2, GL_FLOAT, 2 * sizeof (float), verts);
OglDrawArrays (GL_QUADS, 0, 4);
ogl.DisableClientStates (1, (nColors == 4), 0, GL_TEXTURE0);
}
Example #2
0
void CBitmap::OglRender (tRgbaColorf* colorP, int nColors, int orient)
{
glBegin (GL_QUADS);
glColor4fv (reinterpret_cast<GLfloat*> (colorP));
SetTexCoord (m_render.u1, m_render.v1, orient);
glVertex2f (m_render.x0, m_render.y0);
if (nColors > 1)
	glColor4fv (reinterpret_cast<GLfloat*> (colorP + 1));
SetTexCoord (m_render.u2, m_render.v1, orient);
glVertex2f (m_render.x1, m_render.y0);
if (nColors > 1)
	glColor4fv (reinterpret_cast<GLfloat*> (colorP + 2));
SetTexCoord (m_render.u2, m_render.v2, orient);
glVertex2f (m_render.x1, m_render.y1);
if (nColors > 1)
	glColor4fv (reinterpret_cast<GLfloat*> (colorP + 3));
SetTexCoord (m_render.u1, m_render.v2, orient);
glVertex2f (m_render.x0, m_render.y1);
glEnd ();
}
	//оператор присвоени¤
	const MyClassVertexBase & MyClassVertexBase::operator =(const MyClassVertexBase & _MyClassVertexBaseObj)
	{
		//при копировании вершин не копировать хоз¤ина вершины! сообщени¤ будут отсылатьтьс¤ не туда, а новому хоз¤ину(чужому)!
		//*((MyClassMessageSender *)this) =_MyClassVertexBaseObj;
		normal=*(_MyClassVertexBaseObj.GetNormal());
		SetCoord(_MyClassVertexBaseObj.GetCoord());
		MessageSendToAll(MyClassMessage(changeVertexCoord));
		SetTexCoord(_MyClassVertexBaseObj.GetTexCoord());
		//MessageSendToAll(changeVertexTextureCoord);
		return *this;
	}
Example #4
0
void moTexturedGrid::Draw(MOint w, MOint h, MOint l)
{
	float x0, y0, x1, y1;

	for (int j = 0; j < m_size_y - 1; j++)
	{
		glBegin(GL_QUAD_STRIP);
			for (int i = 0; i < m_size_x; i++)
			{
				GetPoint(0, i, j, x0, y0);
				GetPoint(0, i, j + 1, x1, y1);

				x0 *= w; y0 *= h;
				x1 *= w; y1 *= h;

				SetTexCoord(i, j, l);
				glVertex2f(x0, y0);

				SetTexCoord(i, j + 1, l);
				glVertex2f(x1, y1);
			}
		glEnd();
	}
}
Example #5
0
int G3DrawTexPolyLightmap (
    int			nVertices,
    g3sPoint**	pointList,
    tUVL*			uvlList,
    tUVL*			uvlLMap,
    CBitmap*		bmBot,
    CBitmap*		bmTop,
    tLightmap*	lightmap,
    CFixVector*	pvNormal,
    int			orient,
    int			bBlend,
    short			nSegment)
{
    int			i, nFrame, bShaderMerge;
    CBitmap	*bmP = NULL;
    g3sPoint		**ppl;

    if (gameStates.render.nShadowBlurPass == 1) {
        G3DrawWhitePoly (nVertices, pointList);
        return 0;
    }
    if (!bmBot)
        return 1;
    r_tpolyc++;
//if (gameStates.render.nShadowPass != 3)
    glDepthFunc (GL_LEQUAL);
    if (FAST_SHADOWS) {
        if (bBlend)
            glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        else
            glDisable (GL_BLEND);
    }
    else {
        if (gameStates.render.nShadowPass == 3) {
            glEnable (GL_BLEND);
            glBlendFunc (GL_ONE, GL_ONE);
        }
    }
    glDepthFunc (GL_LEQUAL);
    bmBot = bmBot->Override (-1);
    if (bmTop && (bmTop = bmTop->Override (-1)) && bmTop->Frames ()) {
        nFrame = (int) (bmTop->CurFrame () - bmTop->Frames ());
        bmP = bmTop;
        bmTop = bmTop->CurFrame ();
    }
    else
        nFrame = -1;
    if (!lightmap) //lightmapping enabled
        return G3DrawTexPolyMulti (nVertices, pointList, uvlList, uvlLMap, bmBot, bmTop, lightmap, pvNormal, orient, bBlend, nSegment);
// chose shaders depending on whether overlay bitmap present or not
    if ((bShaderMerge = bmTop && gameOpts->ogl.bGlTexMerge)) {
        lmProg = lmShaderProgs [(bmTop->Flags () & BM_FLAG_SUPER_TRANSPARENT) != 0];
        glUseProgramObject (lmProg);
    }
    InitTMU0 (0);	// use render pipeline 0 for bottom texture
    if (bmBot->Bind (1))
        return 1;
    bmBot = bmBot->CurFrame (-1);
    bmBot->Texture ()->Wrap (GL_REPEAT);
    if (bShaderMerge)
        glUniform1i (glGetUniformLocation (lmProg, "btmTex"), 0);
    if (bmTop) { // use render pipeline 1 for overlay texture
        InitTMU1 (0);
        if (bmTop->Bind (1))
            return 1;
        bmTop = bmTop->CurFrame (-1);
        bmTop->Texture ()->Wrap (GL_REPEAT);
        glUniform1i (glGetUniformLocation (lmProg, "topTex"), 1);
    }
// use render pipeline 2 for lightmap texture
    InitTMU2 (0);
//OGL_BINDTEX (lightmap->handle);
    if (bShaderMerge)
        glUniform1i (glGetUniformLocation (lmProg, "lMapTex"), 2);
    glBegin (GL_TRIANGLE_FAN);
    ppl = pointList;
    if (gameStates.render.bFullBright)
        glColor3d (1,1,1);
    for (i = 0; i < nVertices; i++, ppl++) {
        if (!gameStates.render.bFullBright)
            SetTMapColor (uvlList + i, i, bmBot, 1, NULL);
        glMultiTexCoord2f (GL_TEXTURE0, X2F (uvlList [i].u), X2F (uvlList [i].v));
        if (bmTop)
            SetTexCoord (uvlList + i, orient, 1, NULL, 0);
        glMultiTexCoord2f (GL_TEXTURE2_ARB, X2F (uvlLMap [i].u), X2F (uvlLMap [i].v));
        OglVertex3f (*ppl);
    }
    glEnd ();
    ExitTMU (0);
    if (bShaderMerge)
        glUseProgramObject (lmProg = 0);
    return 0;
}
Example #6
0
int G3DrawTexPolyMulti (
    int			nVertices,
    g3sPoint**	pointList,
    tUVL*			uvlList,
    tUVL*			uvlLMap,
    CBitmap*		bmBot,
    CBitmap*		bmTop,
    tLightmap*	lightmap,
    CFixVector*	pvNormal,
    int			orient,
    int			bBlend,
    short			nSegment)
{
    int			i, nShader, nFrame;
    int			bShaderMerge = 0,
                bSuperTransp = 0;
    int			bLight = 1,
                bDynLight = gameStates.render.bApplyDynLight && (gameStates.app.bEndLevelSequence < EL_OUTSIDE),
                bDepthSort,
                bResetColor = 0,
                bOverlay = 0;
    tFaceColor	*pc;
    CBitmap		*bmP = NULL, *mask = NULL;
    g3sPoint		*pl, **ppl;
#if USE_VERTNORMS
    CFloatVector	vNormal, vVertPos;
#endif
#if G3_DRAW_ARRAYS
    int			bVertexArrays = gameData.render.vertP != NULL;
#else
    int			bVertexArrays = 0;
#endif

    if (gameStates.render.nShadowBlurPass == 1) {
        G3DrawWhitePoly (nVertices, pointList);
        return 0;
    }
    if (!bmBot)
        return 1;
    r_tpolyc++;
    if (FAST_SHADOWS) {
        if (!bBlend)
            glDisable (GL_BLEND);
#if 0
        else
            glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif
    }
    else {
        if (gameStates.render.nShadowPass == 1)
            bLight = !bDynLight;
        else if (gameStates.render.nShadowPass == 3) {
            glEnable (GL_BLEND);
            glBlendFunc (GL_ONE, GL_ONE);
        }
    }
    glDepthFunc (GL_LEQUAL);
    bmBot = bmBot->Override (-1);
    bDepthSort = (!bmTop && (gameOpts->render.bDepthSort > 0) &&
                  ((gameStates.render.grAlpha < 1.0f) ||
                   (bmBot->Flags () & (BM_FLAG_TRANSPARENT | BM_FLAG_SEE_THRU | BM_FLAG_TGA)) == (BM_FLAG_TRANSPARENT | BM_FLAG_TGA)));
    if (bmTop && (bmTop = bmTop->Override (-1)) && bmTop->Frames ()) {
        nFrame = (int) (bmTop->CurFrame () - bmTop->Frames ());
        bmP = bmTop;
        bmTop = bmTop->CurFrame ();
    }
    else
        nFrame = -1;
    if (bmTop) {
        if (nFrame < 0)
            bSuperTransp = (bmTop->Flags () & BM_FLAG_SUPER_TRANSPARENT) != 0;
        else
            bSuperTransp = (bmP->Flags () & BM_FLAG_SUPER_TRANSPARENT) != 0;
        bShaderMerge = bSuperTransp && ogl.m_states.bGlTexMerge;
        bOverlay = !bShaderMerge;
    }
    else
        bOverlay = -1;
#if G3_DRAW_ARRAYS
retry:
#endif
    if (bShaderMerge) {
        mask = gameStates.render.textures.bHaveMaskShader ? bmTop->Mask () : NULL;
        nShader = bSuperTransp ? mask ? 2 : 1 : 0;
        glUseProgramObject (activeShaderProg = tmShaderProgs [nShader]);
        INIT_TMU (InitTMU0, GL_TEXTURE0, bmBot, lightmapManager.Buffer (), bVertexArrays, 0);
        glUniform1i (glGetUniformLocation (activeShaderProg, "btmTex"), 0);
        INIT_TMU (InitTMU1, GL_TEXTURE1, bmTop, lightmapManager.Buffer (), bVertexArrays, 0);
        glUniform1i (glGetUniformLocation (activeShaderProg, "topTex"), 1);
        if (mask) {
#if DBG
            InitTMU2 (bVertexArrays);
            G3_BIND (GL_TEXTURE2, mask, lightmapManager.Buffer (), bVertexArrays);
#else
            INIT_TMU (InitTMU2, GL_TEXTURE2, mask, lightmapManager.Buffer (), bVertexArrays, 0);
#endif
            glUniform1i (glGetUniformLocation (activeShaderProg, "maskTex"), 2);
        }
        glUniform1f (glGetUniformLocation (activeShaderProg, "grAlpha"), gameStates.render.grAlpha);
    }
    else if (!bDepthSort) {
        if (bmBot == gameData.endLevel.satellite.bmP) {
            ogl.SelectTMU (GL_TEXTURE0);
            glEnable (GL_TEXTURE_2D);
        }
        else
            InitTMU0 (bVertexArrays);
        if (bmBot->Bind (1))
            return 1;
        bmBot = bmBot->CurFrame (-1);
        bmBot->Texture ()->Wrap ((bmBot == bmpDeadzone) ? GL_CLAMP : GL_REPEAT);
    }

    if (!bDepthSort) {
        if (SHOW_DYN_LIGHT) {
#if USE_VERTNORMS
            if (pvNormal) {
                vNormal.Assign (*pvNormal);
                transformation.Rotate(vNormal, vNormal, 0);
            }
            else
                G3CalcNormal (pointList, &vNormal);
#else
            G3Normal (pointList, pvNormal);
#endif
        }
        if (gameStates.render.bFullBright) {
            glColor3f (1,1,1);
            bLight = 0;
        }
        else if (!gameStates.render.nRenderPass)
            bLight = 0;
        else if (!bLight)
            glColor3i (0,0,0);
        if (!bLight)
            bDynLight = 0;
        ogl.m_states.bDynObjLight = bDynLight;
    }

    ogl.m_states.fAlpha = gameStates.render.grAlpha;
    if (bVertexArrays || bDepthSort) {
        CFloatVector	vertices [8];
        tFaceColor		vertColors [8];
        tTexCoord2f		texCoord [2][8];
        int				vertIndex [8];
        //int				colorIndex [8];

        for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
            pl = *ppl;
            vertIndex [i] = pl->p3_index;
            //colorIndex [i] = i;
            if (pl->p3_index < 0)
                vertices[i].Assign (pl->p3_vec);
            else
                vertices [i] = gameData.render.vertP [pl->p3_index];
            texCoord [0][i].v.u = X2F (uvlList [i].u);
            texCoord [0][i].v.v = X2F (uvlList [i].v);
            SetTexCoord (uvlList + i, orient, 1, texCoord [1] + i, 0);
            G3VERTPOS (vVertPos, pl);
            if (bDynLight)
                G3VertexColor (G3GetNormal (pl, &vNormal), vVertPos.XYZ(), vertIndex [i], vertColors + i, NULL,
                               gameStates.render.nState ? X2F (uvlList [i].l) : 1, 0, 0);
            else if (bLight)
                SetTMapColor (uvlList + i, i, bmBot, !bOverlay, vertColors + i);
        }
#if 1
        if (gameOpts->render.bDepthSort > 0) {
            bmBot->SetupTexture (1, 0);
            transparencyRenderer.AddPoly (NULL, NULL, bmBot, vertices, nVertices, texCoord [0], NULL, vertColors, nVertices, 1, GL_TRIANGLE_FAN, GL_REPEAT, 0, nSegment);
            return 0;
        }
#endif
    }
#if G3_DRAW_ARRAYS
    if (bVertexArrays) {
        if (!ogl.EnableClientStates (1, 1, 0, GL_TEXTURE0)) {
            bVertexArrays = 0;
            goto retry;
        }
        OglVertexPointer (3, GL_FLOAT, sizeof (CFloatVector), vertices);
//	OglIndexPointer (GL_INT, 0, colorIndex);
        OglTexCoordPointer (2, GL_FLOAT, sizeof (tTexCoord3f), texCoord [0]);
        if (bLight)
            OglColorPointer (4, GL_FLOAT, sizeof (tFaceColor), vertColors);
        if (bmTop && !bOverlay) {
            if (!ogl.EnableClientStates (1, 1, 0, GL_TEXTURE1)) {
                ogl.DisableClientStates (1, 1, 0, GL_TEXTURE0);
                bVertexArrays = 0;
                goto retry;
            }
            OglVertexPointer (3, GL_FLOAT, sizeof (CFloatVector), vertices);
            if (bLight)
                OglColorPointer (4, GL_FLOAT, sizeof (tFaceColor), vertColors);
//		OglIndexPointer (GL_INT, 0, colorIndex);
            OglTexCoordPointer (2, GL_FLOAT, sizeof (tTexCoord3f), texCoord [1]);
        }
        OglDrawArrays (GL_TRIANGLE_FAN, 0, nVertices);
        ogl.DisableClientStates (1, 1, 0, GL_TEXTURE0);
        if (bmTop && !bOverlay)
            ogl.DisableClientStates (GL_TEXTURE1);
    }
    else
#endif
    {
        glBegin (GL_TRIANGLE_FAN);
        if (bDynLight) {
            if (bOverlay) {
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    pl = *ppl;
                    G3VERTPOS (vVertPos, pl);
                    G3VertexColor (G3GetNormal (pl, &vNormal), vVertPos.XYZ(), pl->p3_index, NULL, NULL,
                                   gameStates.render.nState ? X2F (uvlList [i].l) : 1, 1, 0);
                    glTexCoord2f (X2F (uvlList [i].u), X2F (uvlList [i].v));
                    glVertex3fv (reinterpret_cast<GLfloat*> (&vVertPos));
                }
            }
            else {
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    pl = *ppl;
                    G3VERTPOS (vVertPos, pl);
                    G3VertexColor (G3GetNormal (pl, &vNormal), vVertPos.XYZ(), pl->p3_index, NULL, NULL,
                                   /*gameStates.render.nState ? X2F (uvlList [i].l) :*/ 1, 1, 0);
                    glMultiTexCoord2f (GL_TEXTURE0, X2F (uvlList [i].u), X2F (uvlList [i].v));
                    SetTexCoord (uvlList + i, orient, 1, NULL, mask != NULL);
                    glVertex3fv (reinterpret_cast<GLfloat*> (&vVertPos));
                }
            }
        }
        else if (bLight) {
            if (bOverlay) {
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    if (gameStates.render.nState || gameStates.app.bEndLevelSequence)
                        SetTMapColor (uvlList + i, i, bmBot, 1, NULL);
                    else {
                        pc = gameData.render.color.vertices + (*ppl)->p3_index;
                        glColor3fv (reinterpret_cast<GLfloat*> (&pc->color));
                    }
                    glTexCoord2f (X2F (uvlList [i].u), X2F (uvlList [i].v));
                    OglVertex3f (*ppl);
                }
            }
            else {
                bResetColor = (bOverlay != 1);
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    if (gameStates.render.nState || !RENDERPATH)
                        SetTMapColor (uvlList + i, i, bmBot, 1, NULL);
                    else {
                        pc = gameData.render.color.vertices + (*ppl)->p3_index;
                        glColor3fv (reinterpret_cast<GLfloat*> (&pc->color));
                    }
                    glMultiTexCoord2f (GL_TEXTURE0, X2F (uvlList [i].u), X2F (uvlList [i].v));
                    SetTexCoord (uvlList + i, orient, 1, NULL, mask != NULL);
                    OglVertex3f (*ppl);
                }
            }
        }
        else {
            if (bOverlay) {
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    glTexCoord2f (X2F (uvlList [i].u), X2F (uvlList [i].v));
                    OglVertex3f (*ppl);
                }
            }
            else {
                for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                    glMultiTexCoord2f (GL_TEXTURE0, X2F (uvlList [i].u), X2F (uvlList [i].v));
                    SetTexCoord (uvlList + i, orient, 1, NULL, mask != NULL);
                    OglVertex3f (*ppl);
                }
            }
        }
        glEnd ();
    }
    if (bOverlay > 0) {
        r_tpolyc++;
        ogl.SelectTMU (GL_TEXTURE0);
        glEnable (GL_TEXTURE_2D);
        if (bmTop->Bind (1))
            return 1;
        bmTop = bmTop->CurFrame (-1);
        bmTop->Texture ()->Wrap (GL_REPEAT);
        glBegin (GL_TRIANGLE_FAN);
        if (bDynLight) {
            for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                vVertPos.Assign ((*ppl)->p3_vec);
                G3VertexColor (G3GetNormal (*ppl, &vNormal), vVertPos.XYZ(), (*ppl)->p3_index, NULL, NULL, 1, 1, 0);
                SetTexCoord (uvlList + i, orient, 0, NULL, mask != NULL);
                OglVertex3f (*ppl);
            }
        }
        else if (bLight) {
            for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                SetTMapColor (uvlList + i, i, bmTop, 1, NULL);
                SetTexCoord (uvlList + i, orient, 0, NULL, mask != NULL);
                OglVertex3f (*ppl);
            }
        }
        else {
            for (i = 0, ppl = pointList; i < nVertices; i++, ppl++) {
                SetTexCoord (uvlList + i, orient, 0, NULL, mask != NULL);
                OglVertex3f (*ppl);
            }
        }
        glEnd ();
        glDepthFunc (GL_LESS);
#if OGL_CLEANUP
        OGL_BINDTEX (0);
        glDisable (GL_TEXTURE_2D);
#endif
    }
    else if (bShaderMerge) {
#if OGL_CLEANUP
        ogl.SelectTMU (GL_TEXTURE1, bVertexArrays != 0);
        OGL_BINDTEX (0);
        glDisable (GL_TEXTURE_2D); // Disable the 2nd texture
#endif
        glUseProgramObject (activeShaderProg = 0);
    }
    ogl.SelectTMU (GL_TEXTURE0, bVertexArrays != 0);
    OGL_BINDTEX (0);
    glDisable (GL_TEXTURE_2D);
    tMapColor.index =
        lightColor.index = 0;
    if (!bBlend)
        glEnable (GL_BLEND);
    return 0;
}