void PGlTexture::copyTexture(PGlTextureFormatEnum format, 
        puint32 x, puint32 y, puint32 width, puint32 height, puint32 border)
{
    PASSERT(m_target == GL_TEXTURE_2D);
    PASSERT(m_enabled);

    puint32 internalFormat;
    puint32 dataFormat;
    interpretFormat(format, internalFormat, dataFormat);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, internalFormat, x, y, width, height, border);

    pGlErrorCheckError();
}
pbool PGlTexture::create(puint8* data, puint32 width, puint32 height, 
    PGlTextureFormatEnum format, pbool mipmap)
{
    // We can't overwrite an existing texture.
    if (m_texture != 0)
    {
        PLOG_WARNINGX(P_LOG_CHANNEL_OPENGLEGL, "Texture can't be overwritten");
        return false;
    }

    glGenTextures(1, &m_texture);

    m_target = GL_TEXTURE_2D;
    m_compressed = false;
    m_mipmap = mipmap;

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(m_target, m_texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    // Use the same texture format for internalFormat and format in OpenGL ES 2.0.
    puint32 internalFormat;
    puint32 dataFormat;
    interpretFormat(format, internalFormat, dataFormat);

    // Compute the size of the texture
    switch (format)
    {
        case P_GLTEXTURE_FORMAT_R8: m_bytes = width * height; break;
        case P_GLTEXTURE_FORMAT_RA88: m_bytes = width * height * 2; break;
        case P_GLTEXTURE_FORMAT_RGB888: m_bytes = width * height * 3; break;
        case P_GLTEXTURE_FORMAT_RGBA8888: m_bytes = width * height * 4; break;
        default:
            PASSERT(!"Unsupported OpenGL texture format");
            PLOG_ERRORX(P_LOG_CHANNEL_OPENGLEGL, "Unsupported OpenGL texture format");
            glDeleteTextures(1, &m_texture);
            return false;
    }

    // Create the OpenGL texture object.
    glTexImage2D(GL_TEXTURE_2D, 
                 0, 
                 internalFormat, 
                 width, 
                 height, 
                 0, 
                 dataFormat, 
                 GL_UNSIGNED_BYTE, 
                 data);
    
    setMipmapInternal(m_mipmap);
    
    setFilteringInternal(m_minFiltering, m_magFiltering);

    setWrapModeInternal(m_wrapModeS, m_wrapModeT);

    glBindTexture(m_target, 0);

    pGlErrorCheckAbort();

    return true;
}
pbool PGlTexture::create(puint8 **data, puint32 *width, puint32 *height, PGlTextureFormatEnum format, 
        pbool mipmap)
{
    // We can't overwrite an existing texture.
    if (m_texture != 0)
    {
        PLOG_WARNINGX(P_LOG_CHANNEL_OPENGLEGL, "Texture can't be overwritten");
        return false;
    }

    glGenTextures(1, &m_texture);

    m_target = GL_TEXTURE_CUBE_MAP;
    m_compressed = false;
    m_mipmap = mipmap;

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(m_target, m_texture);

    // Use the same texture format for internalFormat and format in OpenGL ES 2.0.
    puint32 internalFormat;
    puint32 dataFormat;
    interpretFormat(format, internalFormat, dataFormat);

    // Compute the size of the texture
    m_bytes = 0;
    for (pint32 i = 0; i < 6; i++)
    {
        switch (format)
        {
            case P_GLTEXTURE_FORMAT_R8: m_bytes += width[i] * height[i]; break;
            case P_GLTEXTURE_FORMAT_RA88: m_bytes += width[i] * height[i] * 2; break;
            case P_GLTEXTURE_FORMAT_RGB888: m_bytes += width[i] * height[i] * 3; break;
            case P_GLTEXTURE_FORMAT_RGBA8888: m_bytes += width[i] * height[i] * 4; break;
            default:
                PASSERT(!"Unsupported OpenGL texture format");
                PLOG_ERRORX(P_LOG_CHANNEL_OPENGLEGL, "Unsupported OpenGL texture format");
                glDeleteTextures(1, &m_texture);
                return false;
        }
    }

    // Create the OpenGL texture object.
    for (pint32 i = 0; i < 6; i++)
    {
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 
                     0, 
                     internalFormat, 
                     width[i], 
                     height[i], 
                     0, 
                     dataFormat, 
                     GL_UNSIGNED_BYTE, 
                     data[i]);
    }
    
    setMipmapInternal(m_mipmap);
    
    setFilteringInternal(m_minFiltering, m_magFiltering);

    if (m_wrapModeS != P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE ||
        m_wrapModeT != P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE)
    {
        PLOG_WARNINGX(P_LOG_CHANNEL_OPENGLEGL, "Cubemap only supports wrapping of clamping to edge");
        m_wrapModeS = P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE;
        m_wrapModeT = P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE;
    }
    setWrapModeInternal(m_wrapModeS, m_wrapModeT);

    glBindTexture(m_target, 0);

    // FIXME: how to ensure the completeness of the cubemap.

    pGlErrorCheckAbort();

    return true;
}
Exemple #4
0
/**
 * \brief This function interprets APIVSXML Code
 *
 * \param[in]	pCode - Start of code to interpret
 * \return		STATUS_PASS - Test conformance (PASS)
 * 				STATUS_FAIL - Test nonconformance (FAIL)
 */
int16_t
interpretPcode(P_CODE *pCode)
{
	int16_t	status = STATUS_PASS;
	boolean	done = FALSE;

	// Execute the pCode
	while (NULL != pCode)
	{
		// Execute current statment
		switch (pCode->type)
		{
			case PC_E_PRINT:
			{
				status = interpretPrint(pCode);
			}
			break;

			case PC_E_SET:
			{
				status = interpretSet(pCode);
			}
			break;

			case PC_E_FUNC:
			{
				status = interpretFunction(pCode);
			}
			break;

			case PC_E_IF:
			{
				status = interpretIf(pCode);
			}
			break;

			case PC_E_WHILE:
			{
				status = interpretWhile(pCode);
			}
			break;

			case PC_E_THEN:
			{
				outputXmlAttrAddCommon(LEVEL_TRACE, &pCode->common, A_NAME);
				outputXmlTagOpen(LEVEL_TRACE, P_THEN, outputXmlAttrGet());

				status = interpretPcode(pCode->pCode);

				outputXmlTagClose(LEVEL_TRACE, P_THEN);

				// Note done with this tree branch
				done = TRUE;
			}
			break;

			case PC_E_ELSE:
			{
				outputXmlAttrAddCommon(LEVEL_TRACE, &pCode->common, A_NAME);
				outputXmlTagOpen(LEVEL_TRACE, P_ELSE, outputXmlAttrGet());

				status = interpretPcode(pCode->pCode);

				outputXmlTagClose(LEVEL_TRACE, P_ELSE);

				// Note done with this tree branch
				done = TRUE;
			}
			break;

			case PC_E_CALL:
			{
				status = interpretCall(pCode);
			}
			break;

			case PC_E_SIG:
			{
				status = interpretSignal(pCode);
			}
			break;

			case PC_E_AUX:
			{
				status = interpretAux(pCode);
			}
			break;

			case PC_E_ABORT:
			{
				status = interpretAbort(pCode);
			}
			break;

			case PC_E_DUMP:
			{
				status = interpretDump(pCode);
			}
			break;

			case PC_E_LOAD:
			{
				status = interpretLoad(pCode);
			}
			break;

			case PC_E_FORMAT:
			{
				status = interpretFormat(pCode);
			}
			break;

			case PC_E_SLEEP:
			{
				status = interpretSleep(pCode);
			}
			break;

			case PC_E_FPUII:
			{
				status = interpretFPUII(pCode);
			}
			break;

			case PC_E_FIOR:
			{
				status = interpretFIOR(pCode);
			}
			break;

			default:
			{
				char	string[OUTPUT_STRING_MAX];

				sprintf(string,
						"Unknown P_CODE type[%d]",
						pCode->type);
				OUTPUT_ERR(pCode->common.lineNumber,
			   			   string,
						   NULL,
						   pCode->common.pDesc);
				status = STATUS_FAIL;
			}
			break;
		}

		if ( done || (/*(pCode->type == PC_E_ABORT) &&*/ (STATUS_FAIL == status)) )
		{
			break;		// We failed or we are done
		}

		// Move to next P_CODE
		pCode = pCode->pCode;
	}

	return(status);
}