void EventSystem::createMessages() { SDL_Event event; auto messenger = Messenger::getInstance(); Message* msg; while(SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_QUIT); } else if (event.type == SDL_APP_TERMINATING) { msg = messenger->appendMessage(); std::cout << "App Terminating..." << std::endl; msg->setType(enumMessageType::EVENT_QUIT); } else if (event.type == SDL_APP_LOWMEMORY) { msg = messenger->appendMessage(); std::cerr << "Low Memory: Calling Event Quit" << std::endl; msg->setType(enumMessageType::EVENT_QUIT); } else if (event.type == SDL_APP_WILLENTERBACKGROUND) { } else if (event.type == SDL_APP_DIDENTERBACKGROUND) { } else if (event.type == SDL_APP_WILLENTERFOREGROUND) { } else if (event.type == SDL_APP_DIDENTERFOREGROUND) { } else if (event.type == SDL_WINDOWEVENT) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_WINDOW); } else if (event.type == SDL_SYSWMEVENT) { } else if (event.type == SDL_KEYDOWN) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_KEYBOARD); //The key code stringType keyCodeString = SDL_GetScancodeName(event.key.keysym.scancode); msg->customData["Key"] = CustomAttribute(keyCodeString); //whether it was key down or key up msg->customData["bKeyDown"] = CustomAttribute(true); } else if (event.type == SDL_KEYUP) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_KEYBOARD); //The key code stringType keyCodeString = SDL_GetScancodeName(event.key.keysym.scancode); msg->customData["Key"] = CustomAttribute(keyCodeString); //whether it was key down or key up msg->customData["bKeyDown"] = CustomAttribute(false); } else if (event.type == SDL_TEXTEDITING) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TEXT_EDIT); } else if (event.type == SDL_TEXTINPUT) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TEXT_INPUT); } else if (event.type == SDL_MOUSEMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_MOUSE_MOVE); floatType xPosition = event.motion.x; floatType yPosition = event.motion.y; msg->customData["x"] = CustomAttribute(xPosition); msg->customData["y"] = CustomAttribute(yPosition); floatType xRelative = event.motion.xrel; floatType yRelative = event.motion.yrel; msg->customData["xrel"] = CustomAttribute(xRelative); msg->customData["yrel"] = CustomAttribute(yRelative); } else if (event.type == SDL_MOUSEBUTTONDOWN) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_MOUSE_BUTTON); } else if (event.type == SDL_MOUSEBUTTONUP) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_MOUSE_BUTTON); } else if (event.type == SDL_MOUSEWHEEL) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_MOUSE_WHEEL); } else if (event.type == SDL_JOYAXISMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_AXIS); } else if (event.type == SDL_JOYBALLMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_BALL); } else if (event.type == SDL_JOYHATMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_HAT); } else if (event.type == SDL_JOYBUTTONDOWN) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_BUTTON); } else if (event.type == SDL_JOYBUTTONUP) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_BUTTON); } else if (event.type == SDL_JOYDEVICEADDED) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_DEVICE); } else if (event.type == SDL_JOYDEVICEREMOVED) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_JOYSTICK_DEVICE); } else if (event.type == SDL_CONTROLLERAXISMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_AXIS); } else if (event.type == SDL_CONTROLLERBUTTONDOWN) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_BUTTON); } else if (event.type == SDL_CONTROLLERBUTTONUP) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_BUTTON); } else if (event.type == SDL_CONTROLLERDEVICEADDED) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_DEVICE); } else if (event.type == SDL_CONTROLLERDEVICEREMOVED) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_DEVICE); } else if (event.type == SDL_CONTROLLERDEVICEREMAPPED) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_CONTROLLER_DEVICE); } else if (event.type == SDL_FINGERDOWN) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TOUCH_SINGLE); } else if (event.type == SDL_FINGERUP) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TOUCH_SINGLE); } else if (event.type == SDL_FINGERMOTION) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TOUCH_SINGLE); } else if (event.type == SDL_DOLLARGESTURE) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TOUCH_DOLLAR); } else if (event.type == SDL_CLIPBOARDUPDATE) { } else if (event.type == SDL_DROPFILE) { msg = messenger->appendMessage(); msg->setType(enumMessageType::EVENT_TOUCH_SINGLE); } else if (event.type == SDL_LASTEVENT) { } else { msg = messenger->appendMessage(); msg->setType(enumMessageType::NONE); } } //END while(... }
namespace Ogre { // a builtin custom attrib name // ---------------------------------------------- // 0 gl_Vertex vertex // 1 n/a blendWeights // 2 gl_Normal normal // 3 gl_Color colour // 4 gl_SecondaryColor secondary_colour // 5 gl_FogCoord fog_coord // 7 n/a blendIndices // 8 gl_MultiTexCoord0 uv0 // 9 gl_MultiTexCoord1 uv1 // 10 gl_MultiTexCoord2 uv2 // 11 gl_MultiTexCoord3 uv3 // 12 gl_MultiTexCoord4 uv4 // 13 gl_MultiTexCoord5 uv5 // 14 gl_MultiTexCoord6 uv6, tangent // 15 gl_MultiTexCoord7 uv7, binormal GLSLLinkProgram::CustomAttribute GLSLLinkProgram::msCustomAttributes[] = { CustomAttribute("vertex", GLGpuProgram::getFixedAttributeIndex(VES_POSITION, 0)), CustomAttribute("blendWeights", GLGpuProgram::getFixedAttributeIndex(VES_BLEND_WEIGHTS, 0)), CustomAttribute("normal", GLGpuProgram::getFixedAttributeIndex(VES_NORMAL, 0)), CustomAttribute("colour", GLGpuProgram::getFixedAttributeIndex(VES_DIFFUSE, 0)), CustomAttribute("secondary_colour", GLGpuProgram::getFixedAttributeIndex(VES_SPECULAR, 0)), CustomAttribute("blendIndices", GLGpuProgram::getFixedAttributeIndex(VES_BLEND_INDICES, 0)), CustomAttribute("uv0", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 0)), CustomAttribute("uv1", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 1)), CustomAttribute("uv2", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 2)), CustomAttribute("uv3", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 3)), CustomAttribute("uv4", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 4)), CustomAttribute("uv5", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 5)), CustomAttribute("uv6", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 6)), CustomAttribute("uv7", GLGpuProgram::getFixedAttributeIndex(VES_TEXTURE_COORDINATES, 7)), CustomAttribute("tangent", GLGpuProgram::getFixedAttributeIndex(VES_TANGENT, 0)), CustomAttribute("binormal", GLGpuProgram::getFixedAttributeIndex(VES_BINORMAL, 0)), }; GLint getGLGeometryInputPrimitiveType(RenderOperation::OperationType operationType, bool requiresAdjacency) { switch (operationType) { case RenderOperation::OT_POINT_LIST: return GL_POINTS; case RenderOperation::OT_LINE_LIST: case RenderOperation::OT_LINE_STRIP: return requiresAdjacency ? GL_LINES_ADJACENCY_EXT : GL_LINES; default: case RenderOperation::OT_TRIANGLE_LIST: case RenderOperation::OT_TRIANGLE_STRIP: case RenderOperation::OT_TRIANGLE_FAN: return requiresAdjacency ? GL_TRIANGLES_ADJACENCY_EXT : GL_TRIANGLES; } } //----------------------------------------------------------------------- GLint getGLGeometryOutputPrimitiveType(RenderOperation::OperationType operationType) { switch (operationType) { case RenderOperation::OT_POINT_LIST: return GL_POINTS; case RenderOperation::OT_LINE_STRIP: return GL_LINE_STRIP; case RenderOperation::OT_TRIANGLE_STRIP: return GL_TRIANGLE_STRIP; default: OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR, "Geometry shader output operation type can only be point list," "line strip or triangle strip", "GLSLLinkProgram::activate"); } } //----------------------------------------------------------------------- GLSLLinkProgram::GLSLLinkProgram(GLSLGpuProgram* vertexProgram, GLSLGpuProgram* geometryProgram, GLSLGpuProgram* fragmentProgram) : mVertexProgram(vertexProgram) , mGeometryProgram(geometryProgram) , mFragmentProgram(fragmentProgram) , mUniformRefsBuilt(false) , mLinked(false) { //checkForGLSLError( "GLSLLinkProgram::GLSLLinkProgram", "Error prior to Creating GLSL Program Object", 0); glGetError(); //Clean up the error. Otherwise will flood log. mGLHandle = glCreateProgramObjectARB(); checkForGLSLError( "GLSLLinkProgram::GLSLLinkProgram", "Error Creating GLSL Program Object", 0 ); // tell shaders to attach themselves to the LinkProgram // let the shaders do the attaching since they may have several children to attach if (mVertexProgram) { mVertexProgram->getGLSLProgram()->attachToProgramObject(mGLHandle); setSkeletalAnimationIncluded(mVertexProgram->isSkeletalAnimationIncluded()); } if (mGeometryProgram) { mGeometryProgram->getGLSLProgram()->attachToProgramObject(mGLHandle); //Don't set adjacency flag. We handle it internally and expose "false" } if (mFragmentProgram) { mFragmentProgram->getGLSLProgram()->attachToProgramObject(mGLHandle); } } //----------------------------------------------------------------------- GLSLLinkProgram::~GLSLLinkProgram(void) { glDeleteObjectARB(mGLHandle); } //----------------------------------------------------------------------- void GLSLLinkProgram::activate(void) { if (!mLinked) { if (mVertexProgram) { // Some drivers (e.g. OS X on nvidia) incorrectly determine the attribute binding automatically // and end up aliasing existing built-ins. So avoid! // Bind all used attribs - not all possible ones otherwise we'll get // lots of warnings in the log, and also may end up aliasing names used // as varyings by accident // Because we can't ask GL whether an attribute is used in the shader // until it is linked (chicken and egg!) we have to parse the source size_t numAttribs = sizeof(msCustomAttributes)/sizeof(CustomAttribute); const String& vpSource = mVertexProgram->getGLSLProgram()->getSource(); for (size_t i = 0; i < numAttribs; ++i) { const CustomAttribute& a = msCustomAttributes[i]; // we're looking for either: // attribute vec<n> <semantic_name> // in vec<n> <semantic_name> // The latter is recommended in GLSL 1.3 onwards // be slightly flexible about formatting String::size_type pos = vpSource.find(a.name); if (pos != String::npos) { String::size_type startpos = vpSource.find("attribute", pos < 20 ? 0 : pos-20); if (startpos == String::npos) startpos = vpSource.find("in", pos-20); if (startpos != String::npos && startpos < pos) { // final check String expr = vpSource.substr(startpos, pos + a.name.length() - startpos); StringVector vec = StringUtil::split(expr); if ((vec[0] == "in" || vec[0] == "attribute") && vec[2] == a.name) glBindAttribLocationARB(mGLHandle, a.attrib, a.name.c_str()); } } } } if (mGeometryProgram) { RenderOperation::OperationType inputOperationType = mGeometryProgram->getGLSLProgram()->getInputOperationType(); glProgramParameteriEXT(mGLHandle,GL_GEOMETRY_INPUT_TYPE_EXT, getGLGeometryInputPrimitiveType(inputOperationType, mGeometryProgram->isAdjacencyInfoRequired())); RenderOperation::OperationType outputOperationType = mGeometryProgram->getGLSLProgram()->getOutputOperationType(); switch (outputOperationType) { case RenderOperation::OT_POINT_LIST: case RenderOperation::OT_LINE_STRIP: case RenderOperation::OT_TRIANGLE_STRIP: case RenderOperation::OT_LINE_LIST: case RenderOperation::OT_TRIANGLE_LIST: case RenderOperation::OT_TRIANGLE_FAN: break; } glProgramParameteriEXT(mGLHandle,GL_GEOMETRY_OUTPUT_TYPE_EXT, getGLGeometryOutputPrimitiveType(outputOperationType)); glProgramParameteriEXT(mGLHandle,GL_GEOMETRY_VERTICES_OUT_EXT, mGeometryProgram->getGLSLProgram()->getMaxOutputVertices()); } glLinkProgramARB( mGLHandle ); glGetObjectParameterivARB( mGLHandle, GL_OBJECT_LINK_STATUS_ARB, &mLinked ); // force logging and raise exception if not linked checkForGLSLError( "GLSLLinkProgram::Activate", "Error linking GLSL Program Object : ", mGLHandle, !mLinked, !mLinked ); if(mLinked) { logObjectInfo( String("GLSL link result : "), mGLHandle ); buildGLUniformReferences(); extractAttributes(); } } if (mLinked) { checkForGLSLError( "GLSLLinkProgram::Activate", "Error prior to using GLSL Program Object : ", mGLHandle, false, false); glUseProgramObjectARB( mGLHandle ); checkForGLSLError( "GLSLLinkProgram::Activate", "Error using GLSL Program Object : ", mGLHandle, false, false); } } //----------------------------------------------------------------------- void GLSLLinkProgram::extractAttributes(void) { size_t numAttribs = sizeof(msCustomAttributes)/sizeof(CustomAttribute); for (size_t i = 0; i < numAttribs; ++i) { const CustomAttribute& a = msCustomAttributes[i]; GLint attrib = glGetAttribLocationARB(mGLHandle, a.name.c_str()); if (attrib != -1) { mValidAttributes.insert(a.attrib); } } } //----------------------------------------------------------------------- GLuint GLSLLinkProgram::getAttributeIndex(VertexElementSemantic semantic, uint index) { return GLGpuProgram::getFixedAttributeIndex(semantic, index); } //----------------------------------------------------------------------- bool GLSLLinkProgram::isAttributeValid(VertexElementSemantic semantic, uint index) { return mValidAttributes.find(getAttributeIndex(semantic, index)) != mValidAttributes.end(); } //----------------------------------------------------------------------- void GLSLLinkProgram::buildGLUniformReferences(void) { if (!mUniformRefsBuilt) { const GpuConstantDefinitionMap* vertParams = 0; const GpuConstantDefinitionMap* fragParams = 0; const GpuConstantDefinitionMap* geomParams = 0; if (mVertexProgram) { vertParams = &(mVertexProgram->getGLSLProgram()->getConstantDefinitions().map); } if (mGeometryProgram) { geomParams = &(mGeometryProgram->getGLSLProgram()->getConstantDefinitions().map); } if (mFragmentProgram) { fragParams = &(mFragmentProgram->getGLSLProgram()->getConstantDefinitions().map); } GLSLLinkProgramManager::getSingleton().extractUniforms( mGLHandle, vertParams, geomParams, fragParams, mGLUniformReferences); mUniformRefsBuilt = true; } } //----------------------------------------------------------------------- void GLSLLinkProgram::updateUniforms(GpuProgramParametersSharedPtr params, uint16 mask, GpuProgramType fromProgType) { // iterate through uniform reference list and update uniform values GLUniformReferenceIterator currentUniform = mGLUniformReferences.begin(); GLUniformReferenceIterator endUniform = mGLUniformReferences.end(); for (; currentUniform != endUniform; ++currentUniform) { // Only pull values from buffer it's supposed to be in (vertex or fragment) // This method will be called twice, once for vertex program params, // and once for fragment program params. if (fromProgType == currentUniform->mSourceProgType) { const GpuConstantDefinition* def = currentUniform->mConstantDef; if (def->variability & mask) { GLsizei glArraySize = (GLsizei)def->arraySize; // get the index in the parameter real list switch (def->constType) { case GCT_FLOAT1: glUniform1fvARB(currentUniform->mLocation, glArraySize, params->getFloatPointer(def->physicalIndex)); break; case GCT_FLOAT2: glUniform2fvARB(currentUniform->mLocation, glArraySize, params->getFloatPointer(def->physicalIndex)); break; case GCT_FLOAT3: glUniform3fvARB(currentUniform->mLocation, glArraySize, params->getFloatPointer(def->physicalIndex)); break; case GCT_FLOAT4: glUniform4fvARB(currentUniform->mLocation, glArraySize, params->getFloatPointer(def->physicalIndex)); break; case GCT_MATRIX_2X2: glUniformMatrix2fvARB(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); break; case GCT_MATRIX_2X3: if (GLEW_VERSION_2_1) { glUniformMatrix2x3fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_2X4: if (GLEW_VERSION_2_1) { glUniformMatrix2x4fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_3X2: if (GLEW_VERSION_2_1) { glUniformMatrix3x2fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_3X3: glUniformMatrix3fvARB(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); break; case GCT_MATRIX_3X4: if (GLEW_VERSION_2_1) { glUniformMatrix3x4fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_4X2: if (GLEW_VERSION_2_1) { glUniformMatrix4x2fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_4X3: if (GLEW_VERSION_2_1) { glUniformMatrix4x3fv(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); } break; case GCT_MATRIX_4X4: glUniformMatrix4fvARB(currentUniform->mLocation, glArraySize, GL_TRUE, params->getFloatPointer(def->physicalIndex)); break; case GCT_INT1: glUniform1ivARB(currentUniform->mLocation, glArraySize, (GLint*)params->getIntPointer(def->physicalIndex)); break; case GCT_INT2: glUniform2ivARB(currentUniform->mLocation, glArraySize, (GLint*)params->getIntPointer(def->physicalIndex)); break; case GCT_INT3: glUniform3ivARB(currentUniform->mLocation, glArraySize, (GLint*)params->getIntPointer(def->physicalIndex)); break; case GCT_INT4: glUniform4ivARB(currentUniform->mLocation, glArraySize, (GLint*)params->getIntPointer(def->physicalIndex)); break; case GCT_SAMPLER1D: case GCT_SAMPLER1DSHADOW: case GCT_SAMPLER2D: case GCT_SAMPLER2DSHADOW: case GCT_SAMPLER3D: case GCT_SAMPLERCUBE: // samplers handled like 1-element ints glUniform1ivARB(currentUniform->mLocation, 1, (GLint*)params->getIntPointer(def->physicalIndex)); break; case GCT_UNKNOWN: break; } // end switch #if OGRE_DEBUG_MODE checkForGLSLError( "GLSLLinkProgram::updateUniforms", "Error updating uniform", 0 ); #endif } // variability & mask } // fromProgType == currentUniform->mSourceProgType } // end for } //----------------------------------------------------------------------- void GLSLLinkProgram::updatePassIterationUniforms(GpuProgramParametersSharedPtr params) { if (params->hasPassIterationNumber()) { size_t index = params->getPassIterationNumberIndex(); GLUniformReferenceIterator currentUniform = mGLUniformReferences.begin(); GLUniformReferenceIterator endUniform = mGLUniformReferences.end(); // need to find the uniform that matches the multi pass entry for (; currentUniform != endUniform; ++currentUniform) { // get the index in the parameter real list if (index == currentUniform->mConstantDef->physicalIndex) { glUniform1fvARB( currentUniform->mLocation, 1, params->getFloatPointer(index)); // there will only be one multipass entry return; } } } } } // namespace Ogre