void drawPoint(const Vec2& point) { lazy_init(); Vec2 p; p.x = point.x; p.y = point.y; GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); s_shader->setUniformLocationWith1f(s_pointSizeLocation, s_pointSize); #ifdef EMSCRIPTEN setGLBufferData(&p, 8); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, &p); #endif // EMSCRIPTEN glDrawArrays(GL_POINTS, 0, 1); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,1); }
void drawSolidPoly(const KKPoint* poli, unsigned int numberOfPoints) { lazy_init(); shader_->use(); shader_->setUniformForModelViewProjectionMatrix(); colorUniform->setUniform4fv((GLfloat *)&color_.r, 1); CHECK_GL_ERROR_DEBUG(); glEnableVertexAttribArray(kVertexAttrib_Position); //开启顶点属性数组 GLfloat *newPoli = new GLfloat(numberOfPoints*2); if (sizeof(KKPoint) == sizeof(GLfloat)*2) { glVertexAttribPointer(kVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, poli); } else { for (unsigned int i = 0; i < numberOfPoints; i++) { newPoli[i*2] = poli[i].x; newPoli[i*2+1] = poli[i].y; } glVertexAttribPointer(kVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoli); } glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei)numberOfPoints);//将顶点数组使用三角形渲染,GL_TRIANGLE_FAN表示矩形, 0表示数组第一个值的位置,2表示数组长度 delete newPoli; }
void drawSolidCircle( const Vec2& center, float radius, float angle, unsigned int segments, float scaleX, float scaleY) { lazy_init(); const float coef = 2.0f * (float)M_PI/segments; GLfloat *vertices = (GLfloat*)calloc( sizeof(GLfloat)*2*(segments+2), 1); if( ! vertices ) return; for(unsigned int i = 0;i <= segments; i++) { float rads = i*coef; GLfloat j = radius * cosf(rads + angle) * scaleX + center.x; GLfloat k = radius * sinf(rads + angle) * scaleY + center.y; vertices[i*2] = j; vertices[i*2+1] = k; } vertices[(segments+1)*2] = center.x; vertices[(segments+1)*2+1] = center.y; s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) segments+1); ::free( vertices ); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,segments+1); }
void ccDrawCubicBezier(const CCPoint& origin, const CCPoint& control1, const CCPoint& control2, const CCPoint& destination, unsigned int segments) { lazy_init(); ccVertex2F* vertices = new ccVertex2F[segments + 1]; float t = 0; for(unsigned int i = 0; i < segments; i++) { vertices[i].x = powf(1 - t, 3) * origin.x + 3.0f * powf(1 - t, 2) * t * control1.x + 3.0f * (1 - t) * t * t * control2.x + t * t * t * destination.x; vertices[i].y = powf(1 - t, 3) * origin.y + 3.0f * powf(1 - t, 2) * t * control1.y + 3.0f * (1 - t) * t * t * control2.y + t * t * t * destination.y; t += 1.0f / segments; } vertices[segments].x = destination.x; vertices[segments].y = destination.y; shader_->use(); shader_->setUniformForModelViewProjectionMatrix(); shader_->setUniformLocationWith4fv(colorLocation_, (GLfloat*) &color_.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawPoint( const CCPoint& point ) { lazy_init(); ccVertex2F p; p.x = point.x; p.y = point.y; ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); s_pShader->setUniformLocationWith1f(s_nPointSizeLocation, s_fPointSize); #ifdef EMSCRIPTEN setGLBufferData(&p, 8); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, &p); #endif // EMSCRIPTEN glDrawArrays(GL_POINTS, 0, 1); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawPoints( const CCPoint *points, unsigned int numberOfPoints ) { lazy_init(); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); shader_->use(); shader_->setUniformForModelViewProjectionMatrix(); shader_->setUniformLocationWith4fv(colorLocation_, (GLfloat*) &color_.r, 1); shader_->setUniformLocationWith1f(pointSizeLocation_, pointSize_); // XXX: Mac OpenGL error. arrays can't go out of scope before draw is executed ccVertex2F* newPoints = new ccVertex2F[numberOfPoints]; // iPhone and 32-bit machines optimization if( sizeof(CCPoint) == sizeof(ccVertex2F) ) { glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, points); } else { // Mac on 64-bit for( unsigned int i=0; i<numberOfPoints;i++) { newPoints[i].x = points[i].x; newPoints[i].y = points[i].y; } glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoints); } glDrawArrays(GL_POINTS, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoints); CC_INCREMENT_GL_DRAWS(1); }
void drawSolidPoly(const Vec2 *poli, unsigned int numberOfPoints, Color4F color) { lazy_init(); s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); // FIXME: Mac OpenGL error. arrays can't go out of scope before draw is executed Vec2* newPoli = new (std::nothrow) Vec2[numberOfPoints]; // iPhone and 32-bit machines optimization if (sizeof(Vec2) == sizeof(Vec2)) { glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, poli); } else { // Mac on 64-bit for(unsigned int i = 0; i < numberOfPoints; i++) { newPoli[i].set(poli[i].x, poli[i].y); } glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoli); } glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoli); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, numberOfPoints); }
void ccDrawCubicBezier(const CCPoint& origin, const CCPoint& control1, const CCPoint& control2, const CCPoint& destination, unsigned int segments) { lazy_init(); ccVertex2F* vertices = new ccVertex2F[segments + 1]; float t = 0; for(unsigned int i = 0; i < segments; i++) { vertices[i].x = powf(1 - t, 3) * origin.x + 3.0f * powf(1 - t, 2) * t * control1.x + 3.0f * (1 - t) * t * t * control2.x + t * t * t * destination.x; vertices[i].y = powf(1 - t, 3) * origin.y + 3.0f * powf(1 - t, 2) * t * control1.y + 3.0f * (1 - t) * t * t * control2.y + t * t * t * destination.y; t += 1.0f / segments; } vertices[segments].x = destination.x; vertices[segments].y = destination.y; s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); #ifdef EMSCRIPTEN setGLBufferData(vertices, (segments + 1) * sizeof(ccVertex2F)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawSolidPoly( const CCPoint *poli, unsigned int numberOfPoints, ccColor4F color ) { lazy_init(); s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &color.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); // XXX: Mac OpenGL error. arrays can't go out of scope before draw is executed ccVertex2F* newPoli = new ccVertex2F[numberOfPoints]; // iPhone and 32-bit machines optimization if( sizeof(CCPoint) == sizeof(ccVertex2F) ) { glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, poli); } else { // Mac on 64-bit for( unsigned int i=0; i<numberOfPoints; i++) { newPoli[i] = vertex2( poli[i].x, poli[i].y ); } glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoli); } glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoli); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawQuadBezier(const CCPoint& origin, const CCPoint& control, const CCPoint& destination, unsigned int segments) { lazy_init(); ccVertex2F* vertices = new ccVertex2F[segments + 1]; float t = 0.0f; for(unsigned int i = 0; i < segments; i++) { vertices[i].x = powf(1 - t, 2) * origin.x + 2.0f * (1 - t) * t * control.x + t * t * destination.x; vertices[i].y = powf(1 - t, 2) * origin.y + 2.0f * (1 - t) * t * control.y + t * t * destination.y; t += 1.0f / segments; } vertices[segments].x = destination.x; vertices[segments].y = destination.y; s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWS(1); }
void drawCubicBezier(const Vec2& origin, const Vec2& control1, const Vec2& control2, const Vec2& destination, unsigned int segments) { lazy_init(); Vec2* vertices = new (std::nothrow) Vec2[segments + 1]; float t = 0; for (unsigned int i = 0; i < segments; i++) { vertices[i].x = powf(1 - t, 3) * origin.x + 3.0f * powf(1 - t, 2) * t * control1.x + 3.0f * (1 - t) * t * t * control2.x + t * t * t * destination.x; vertices[i].y = powf(1 - t, 3) * origin.y + 3.0f * powf(1 - t, 2) * t * control1.y + 3.0f * (1 - t) * t * t * control2.y + t * t * t * destination.y; t += 1.0f / segments; } vertices[segments].x = destination.x; vertices[segments].y = destination.y; s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); #ifdef EMSCRIPTEN setGLBufferData(vertices, (segments + 1) * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,segments+1); }
void drawPoly(const KKPoint *poli, unsigned int numberOfPoints, bool closePolygon) { lazy_init(); shader_->setUniformForModelViewProjectionMatrix(); colorUniform->setUniform4fv((GLfloat *)&color_.r, 1); CHECK_GL_ERROR_DEBUG(); glEnableVertexAttribArray(kVertexAttrib_Position); //开启顶点属性数组 GLfloat *newPoli = new GLfloat(numberOfPoints*2); if (sizeof(KKPoint) == sizeof(GLfloat)*2) { glVertexAttribPointer(kVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, poli); } else { for (unsigned int i = 0; i < numberOfPoints; i++) { newPoli[i*2] = poli[i].x; newPoli[i*2+1] = poli[i].y; } glVertexAttribPointer(kVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoli); } if (closePolygon) { glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); } else { glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) numberOfPoints); } delete newPoli; }
void printf_format_handler_register_static(PrintfFormatHandler* handler) { if (!initialized) lazy_init(); //bei mehrdeutigkeiten wird der zuletzt registrierte handler aufgerufen //das ist ganz was wir wollen handler->next = handler_list; handler_list = handler; }
void ccDrawPoly( const CCPoint *poli, unsigned int numberOfPoints, bool closePolygon ) { lazy_init(); s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); glLineWidth(1); // iPhone and 32-bit machines optimization if( sizeof(CCPoint) == sizeof(ccVertex2F) ) { #ifdef EMSCRIPTEN setGLBufferData((void*) poli, numberOfPoints * sizeof(CCPoint)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, poli); #endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); else glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) numberOfPoints); } else { // Mac on 64-bit // XXX: Mac OpenGL error. arrays can't go out of scope before draw is executed ccVertex2F* newPoli = new ccVertex2F[numberOfPoints]; for( unsigned int i=0; i<numberOfPoints;i++) { newPoli[i].x = poli[i].x; newPoli[i].y = poli[i].y; } #ifdef EMSCRIPTEN setGLBufferData(newPoli, numberOfPoints * sizeof(ccVertex2F)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoli); #endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); else glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoli); } CC_INCREMENT_GL_DRAWS(1); }
void ccDrawCardinalSpline( CCPointArray *config, float tension, unsigned int segments ) { lazy_init(); ccVertex2F* vertices = new ccVertex2F[segments + 1]; unsigned int p; float lt; float deltaT = 1.0f / config->count(); for( unsigned int i=0; i < segments+1;i++) { float dt = (float)i / segments; // border if( dt == 1 ) { p = config->count() - 1; lt = 1; } else { p = dt / deltaT; lt = (dt - deltaT * (float)p) / deltaT; } // Interpolate CCPoint pp0 = config->get(p-1); CCPoint pp1 = config->get(p+0); CCPoint pp2 = config->get(p+1); CCPoint pp3 = config->get(p+2); CCPoint newPos = ccCardinalSplineAt( pp0, pp1, pp2, pp3, tension, lt); vertices[i].x = newPos.x; vertices[i].y = newPos.y; } s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*)&s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); #ifdef EMSCRIPTEN setGLBufferData(vertices, (segments + 1) * sizeof(ccVertex2F)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWS(1); }
void drawPoly(const Vec2 *poli, unsigned int numberOfPoints, bool closePolygon) { lazy_init(); s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); // iPhone and 32-bit machines optimization if( sizeof(Vec2) == sizeof(Vec2) ) { #ifdef EMSCRIPTEN setGLBufferData((void*) poli, numberOfPoints * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, poli); #endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); else glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) numberOfPoints); } else { // Mac on 64-bit // FIXME: Mac OpenGL error. arrays can't go out of scope before draw is executed Vec2* newPoli = new (std::nothrow) Vec2[numberOfPoints]; for( unsigned int i=0; i<numberOfPoints;i++) { newPoli[i].x = poli[i].x; newPoli[i].y = poli[i].y; } #ifdef EMSCRIPTEN setGLBufferData(newPoli, numberOfPoints * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoli); #endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); else glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoli); } CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, numberOfPoints); }
void drawCardinalSpline( PointArray *config, float tension, unsigned int segments ) { lazy_init(); Vec2* vertices = new (std::nothrow) Vec2[segments + 1]; ssize_t p; float lt; float deltaT = 1.0f / config->count(); for( unsigned int i=0; i < segments+1;i++) { float dt = (float)i / segments; // border if( dt == 1 ) { p = config->count() - 1; lt = 1; } else { p = dt / deltaT; lt = (dt - deltaT * (float)p) / deltaT; } // Interpolate Vec2 pp0 = config->getControlPointAtIndex(p-1); Vec2 pp1 = config->getControlPointAtIndex(p+0); Vec2 pp2 = config->getControlPointAtIndex(p+1); Vec2 pp3 = config->getControlPointAtIndex(p+2); Vec2 newPos = ccCardinalSplineAt( pp0, pp1, pp2, pp3, tension, lt); vertices[i].x = newPos.x; vertices[i].y = newPos.y; } s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*)&s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); #ifdef EMSCRIPTEN setGLBufferData(vertices, (segments + 1) * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,segments+1); }
void acc_set_device_num (int n, acc_device_t d) { const struct gomp_device_descr *dev; int num_devices; if (!base_dev) gomp_init_targets_once (); if ((int) d == 0) { int i; /* A device setting of zero sets all device types on the system to use the Nth instance of that device type. Only attempt it for initialized devices though. */ for (i = acc_device_not_host + 1; i < _ACC_device_hwm; i++) { dev = resolve_device (d); if (dev && dev->is_initialized) dev->openacc.set_device_num_func (n); } /* ...and for future calls to acc_init/acc_set_device_type, etc. */ goacc_device_num = n; } else { struct goacc_thread *thr = goacc_thread (); gomp_mutex_lock (&acc_device_lock); base_dev = lazy_init (d); num_devices = base_dev->get_num_devices_func (); if (n >= num_devices) gomp_fatal ("device %u out of range", n); /* If we're changing the device number, de-associate this thread with the device (but don't close the device, since it may be in use by other threads). */ if (thr && thr->dev && n != thr->dev->target_id) thr->dev = NULL; lazy_open (n); gomp_mutex_unlock (&acc_device_lock); } }
static void lazy_init_and_open (acc_device_t d) { if (!base_dev) gomp_init_targets_once (); gomp_mutex_lock (&acc_device_lock); base_dev = lazy_init (d); lazy_open (-1); gomp_mutex_unlock (&acc_device_lock); }
int buffer_append(struct buffer* b, const void* data, size_t n) { assert(b); if(unlikely(b->data == NULL) && unlikely(lazy_init(b))) return 1; if(unlikely(buffer_reserve(b, b->len + n))) return 1; memcpy(b->data + b->len, data, n); b->len += n; return 0; }
void ccDrawLines(ccVertex2F* vertices,int size) { lazy_init(); s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_LINE_STRIP, 0, size); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawPoints( const CCPoint *points, unsigned int numberOfPoints ) { lazy_init(); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); s_pShader->setUniformLocationWith1f(s_nPointSizeLocation, s_fPointSize); // XXX: Mac OpenGL error. arrays can't go out of scope before draw is executed ccVertex2F* newPoints = new ccVertex2F[numberOfPoints]; // iPhone and 32-bit machines optimization if( sizeof(CCPoint) == sizeof(ccVertex2F) ) { #ifdef EMSCRIPTEN setGLBufferData((void*) points, numberOfPoints * sizeof(CCPoint)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, points); #endif // EMSCRIPTEN } else { // Mac on 64-bit for( unsigned int i=0; i<numberOfPoints;i++) { newPoints[i].x = points[i].x; newPoints[i].y = points[i].y; } #ifdef EMSCRIPTEN // Suspect Emscripten won't be emitting 64-bit code for a while yet, // but want to make sure this continues to work even if they do. setGLBufferData(newPoints, numberOfPoints * sizeof(ccVertex2F)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, newPoints); #endif // EMSCRIPTEN } glDrawArrays(GL_POINTS, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoints); CC_INCREMENT_GL_DRAWS(1); }
void drawCircle( const Point& center, float width, float height, float angle, unsigned int segments, bool drawLineToCenter, float scaleX, float scaleY) { lazy_init(); width *= 0.5f; height *= 0.5f; int additionalSegment = 1; if (drawLineToCenter) additionalSegment++; const float coef = 2.0f * (float)M_PI/segments; GLfloat *vertices = (GLfloat*)calloc( sizeof(GLfloat)*2*(segments+2), 1); if( ! vertices ) return; for(unsigned int i = 0;i <= segments; i++) { float rads = i*coef; GLfloat j = width * cosf(rads + angle) * scaleX + center.x; GLfloat k = height * sinf(rads + angle) * scaleY + center.y; vertices[i*2] = j; vertices[i*2+1] = k; } vertices[(segments+1)*2] = center.x; vertices[(segments+1)*2+1] = center.y; s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); #ifdef EMSCRIPTEN setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments+additionalSegment); ::free( vertices ); CC_INCREMENT_GL_DRAWS(1); }
void drawPoints( const Vec2 *points, unsigned int numberOfPoints ) { lazy_init(); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); s_shader->setUniformLocationWith1f(s_pointSizeLocation, s_pointSize); // FIXME: Mac OpenGL error. arrays can't go out of scope before draw is executed Vec2* newPoints = new (std::nothrow) Vec2[numberOfPoints]; // iPhone and 32-bit machines optimization if( sizeof(Vec2) == sizeof(Vec2) ) { #ifdef EMSCRIPTEN setGLBufferData((void*) points, numberOfPoints * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, points); #endif // EMSCRIPTEN } else { // Mac on 64-bit for( unsigned int i=0; i<numberOfPoints;i++) { newPoints[i].x = points[i].x; newPoints[i].y = points[i].y; } #ifdef EMSCRIPTEN // Suspect Emscripten won't be emitting 64-bit code for a while yet, // but want to make sure this continues to work even if they do. setGLBufferData(newPoints, numberOfPoints * sizeof(Vec2)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoints); #endif // EMSCRIPTEN } glDrawArrays(GL_POINTS, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoints); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, numberOfPoints); }
void drawLine(const KKPoint& origin, const KKPoint& dest) { lazy_init(); GLfloat vertices[4] = {origin.x, origin.y, dest.x, dest.y}; shader_->use(); CHECK_GL_ERROR_DEBUG(); shader_->setUniformForModelViewProjectionMatrix(); CHECK_GL_ERROR_DEBUG(); colorUniform->setUniform4fv((GLfloat *)&color_.r, 1); CHECK_GL_ERROR_DEBUG(); //开启顶点属性数组 glEnableVertexAttribArray(kVertexAttrib_Position); //为顶点着色器位置信息赋值,positionSlot表示顶点着色器位置属性(即,Position);2表示每一个顶点信息由几个值组成,这个值必须位1,2,3或4;GL_FLOAT表示顶点信息的数据类型;GL_FALSE表示不要将数据类型标准化(即fixed-point);stride表示数组中每个元素的长度;pCoords表示数组的首地址 glVertexAttribPointer(kVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); CHECK_GL_ERROR_DEBUG(); glDrawArrays(GL_LINE, 0, 2);//将顶点数组使用三角形渲染,GL_LINE表示直线, 0表示数组第一个值的位置,2表示数组长度 }
void ccDrawLine( const CCPoint& origin, const CCPoint& destination ) { lazy_init(); ccVertex2F vertices[2] = { {origin.x, origin.y}, {destination.x, destination.y} }; s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_LINES, 0, 2); CC_INCREMENT_GL_DRAWS(1); }
void drawSolidPoly( const Point *poli, unsigned int numberOfPoints, Color4F color ) { lazy_init(); s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); // XXX: Mac OpenGL error. arrays can't go out of scope before draw is executed Vertex2F* newPoli = new Vertex2F[numberOfPoints]; // iPhone and 32-bit machines optimization if( sizeof(Point) == sizeof(Vertex2F) ) { #ifdef EMSCRIPTEN setGLBufferData((void*) poli, numberOfPoints * sizeof(Point)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, poli); #endif // EMSCRIPTEN } else { // Mac on 64-bit for( unsigned int i=0; i<numberOfPoints;i++) { newPoli[i] = Vertex2F( poli[i].x, poli[i].y ); } #ifdef EMSCRIPTEN setGLBufferData(newPoli, numberOfPoints * sizeof(Vertex2F)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoli); #endif // EMSCRIPTEN } glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) numberOfPoints); CC_SAFE_DELETE_ARRAY(newPoli); CC_INCREMENT_GL_DRAWS(1); }
void drawLine(const Vec2& origin, const Vec2& destination) { lazy_init(); Vec2 vertices[2] = { Vec2(origin.x, origin.y), Vec2(destination.x, destination.y) }; s_shader->use(); s_shader->setUniformsForBuiltins(); s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_LINES, 0, 2); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,2); }
void ccDrawCircle(const CCPoint& center, float radius, float angle, unsigned int segments, bool drawLineToCenter, float scaleX, float scaleY, bool fill) { lazy_init(); int additionalSegment = 1; if (drawLineToCenter) additionalSegment++; const float coef = 2.0f * (float)M_PI/segments; GLfloat *vertices = (GLfloat*)calloc( sizeof(GLfloat)*2*(segments+2), 1); if( ! vertices ) return; for(unsigned int i = 0;i <= segments; i++) { float rads = i*coef; GLfloat j = radius * cosf(rads + angle) * scaleX + center.x; GLfloat k = radius * sinf(rads + angle) * scaleY + center.y; vertices[i*2] = j; vertices[i*2+1] = k; } vertices[(segments+1)*2] = center.x; vertices[(segments+1)*2+1] = center.y; s_pShader->use(); s_pShader->setUniformsForBuiltins(); s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); #ifdef EMSCRIPTEN setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2)); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); #else glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); #endif // EMSCRIPTEN glDrawArrays(fill ? GL_TRIANGLE_FAN : GL_LINE_STRIP, 0, (GLsizei)segments + additionalSegment); free( vertices ); CC_INCREMENT_GL_DRAWS(1); }
void ccDrawPoint( const CCPoint& point ) { lazy_init(); ccVertex2F p; p.x = point.x; p.y = point.y; ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); shader_->use(); shader_->setUniformForModelViewProjectionMatrix(); shader_->setUniformLocationWith4fv(colorLocation_, (GLfloat*) &color_.r, 1); shader_->setUniformLocationWith1f(pointSizeLocation_, pointSize_); glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, &p); glDrawArrays(GL_POINTS, 0, 1); CC_INCREMENT_GL_DRAWS(1); }