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; }
/** * \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); }