void Program::Reload() { Unuse(); glDeleteProgram(m_program); LoadShaders(m_name, m_defines); InitUniforms(); }
bool VJSGlobalContext::EvaluateScript( const VString& inScript, const VURL *inSource, VValueSingle **outResult, bool inJSONresult ) const { VJSContext context( fContext); Use(); VJSValue result( fContext, NULL); JS4D::ExceptionRef exception = NULL; bool ok = context.EvaluateScript( inScript, inSource, &result, &exception); // first throw an error for javascript if necessary if (JS4D::ThrowVErrorForException( fContext, exception)) { xbox_assert( !ok); // then rethrow an error to explain wat we were doing VTask::GetCurrent()->GetDebugContext().DisableUI(); { VString url; if (inSource != NULL) inSource->GetAbsoluteURL( url, false); if (!url.IsEmpty()) { StThrowError<> error( MAKE_VERROR( 'JS4D', 2)); error->SetString( "url", url); error->SetString( "error_description", CVSTR( "Error evaluating javascript {url}")); } else { StThrowError<> error( MAKE_VERROR( 'JS4D', 3)); error->SetString( "error_description", CVSTR( "Error evaluating javascript")); } } VTask::GetCurrent()->GetDebugContext().EnableUI(); if (outResult != NULL) *outResult = NULL; } else { xbox_assert( ok); if (outResult != NULL) if ( inJSONresult ) { VJSJSON stringifier( fContext ); VString* ptStr = new VString; // The "result" value's fValue is initialized to 0 when a script is aborted using the JS debugger. In this case js core crashes while stringifying, thus the if-else // The if-else can be moved directly into ::Stringify if "null" is acceptable as a generic return value if ( result. IsNull ( ) ) ptStr-> AppendCString ( "null" ); else stringifier.Stringify( result, *ptStr ); *outResult = ptStr; } else *outResult = result.CreateVValue( NULL); } Unuse(); return ok; }
void PrimitiveShader_PC::Flush() { if(buffer_.empty()) return; auto renderer = getRenderer(); Use(); CheckGL(); // Send our transformation to the currently bound shader, // in the "MVP" uniform auto const &pv = renderer->getCamera().getPV(); glEnable(GL_BLEND); if(hasTransform()){ //m[0][2],m[1][2] is always 0 auto const &m = getTransform(); auto pv2 = pv * Mat4(Vec4(m[0][0],m[0][1],0,m[0][2]), Vec4(m[1][0],m[1][1],0,m[1][2]), Vec4(0,0,1,0), Vec4(m[2][0],m[2][1],0,m[2][2])); glUniformMatrix4fv(pv_, 1, GL_FALSE, &pv2[0][0]); }else{ glUniformMatrix4fv(pv_, 1, GL_FALSE, &pv[0][0]); } CheckGL(); glBindBuffer(GL_ARRAY_BUFFER, vbo_); glBufferData(GL_ARRAY_BUFFER, sizeof(Point)*buffer_.size(), (const void*)&buffer_[0], GL_DYNAMIC_DRAW); CheckGL(); // 1rst attribute buffer : vertices glEnableVertexAttribArray(model_xy_); glVertexAttribPointer( model_xy_, // attribute. No particular reason for 0, but must match the layout in the shader. 2, // size GL_FLOAT, // type GL_FALSE, // normalized? sizeof(Point), // stride (void*)0 // array buffer offset ); CheckGL(); // 2nd attribute buffer : color glEnableVertexAttribArray(color_); glVertexAttribPointer( color_, 4, GL_FLOAT, GL_FALSE, sizeof(Point), (void*)(2*sizeof(GLfloat)) ); CheckGL(); glEnable(GL_PROGRAM_POINT_SIZE); glDrawArrays((GLenum)drawMode_, 0, buffer_.size()); glDisable(GL_PROGRAM_POINT_SIZE); CheckGL(); glDisableVertexAttribArray(model_xy_); glDisableVertexAttribArray(color_); glDisable(GL_BLEND); Unuse(); buffer_.clear(); renderer->addRenderCall(); }