/* ASTEROIDS ONLY */
for ( std:: vector < RenderObject * > :: iterator iter = objects.begin ( ) ; iter ! = objects.end ( ) ; ++ iter) {
RenderObject * obj = * iter;
if ( dynamic_cast < Asteroid * > ( obj) == NULL ) {
continue ;
}
// Get the original untransformed model.
std:: vector < glm:: vec3 > vecModel = obj- > Model;
float angle = obj- > Props.Pos .Angle ;
glm:: mat4 transl = glm:: translate ( glm:: mat4 ( 1.0f ) , glm:: vec3 ( obj- > Props.Pos .X , obj- > Props.Pos .Y , 0.0f ) ) ;
for ( size_t i = 0 ; i < vecModel.size ( ) ; i++ ) {
glm:: vec4 vec_temp = glm:: vec4 ( vecModel[ i] , 0.0f ) ;
vec_temp = glm:: vec4 ( glm:: rotateZ ( glm:: vec3 ( vec_temp[ 0 ] , vec_temp[ 1 ] , vec_temp[ 3 ] ) , - angle) , 0.0f ) ;
vec_temp = transl * glm:: vec4 ( vec_temp[ 0 ] , vec_temp[ 1 ] , vec_temp[ 2 ] , 1.0f ) ; // The "1.0f" at the end is important!
vecAllAsteroids_pos.push_back ( glm:: vec2 ( vec_temp[ 0 ] , vec_temp[ 1 ] ) ) ;
}
for ( size_t i = 0 ; i < vecModel.size ( ) ; i = i + 3 ) {
vecAllAsteroids_tex.push_back ( glm:: vec2 ( 0.0f , 0.0f ) ) ;
vecAllAsteroids_tex.push_back ( glm:: vec2 ( 0.0f , 1.0f ) ) ;
vecAllAsteroids_tex.push_back ( glm:: vec2 ( 1.0f , 1.0f ) ) ;
}
}
assert ( vecAllAsteroids_pos.size ( ) == vecAllAsteroids_tex.size ( ) ) ;
glUseProgram( asteroid_prog_id) ;
glActiveTexture( GL_TEXTURE0) ;
glBindTexture( GL_TEXTURE_2D, asteroid_tex_id) ;
glUniform1i( asteroid_uniform_id, 0 ) ;
glBindBuffer( GL_ARRAY_BUFFER, asteroid_vertex_buffer) ;
glBufferData( GL_ARRAY_BUFFER, vecAllAsteroids_pos.size ( ) * sizeof ( glm:: vec2 ) , & vecAllAsteroids_pos[ 0 ] , GL_STATIC_DRAW) ;
glEnableVertexAttribArray( 0 ) ;
glVertexAttribPointer(
0 , // index: the index of the attribute to be modified
2 , // size: the number of components per attribute
GL_FLOAT, // type: the data type of each component
GL_FALSE, // normalized: whether or not to normalize data points
0 , // stride: the byte offset between attributes
( void * ) 0 // pointer: the offset of the first component of the first array attribute
) ;
glBindBuffer( GL_ARRAY_BUFFER, asteroid_texture_buffer) ;
glBufferData( GL_ARRAY_BUFFER, vecAllAsteroids_tex.size ( ) * sizeof ( glm:: vec2 ) , & vecAllAsteroids_tex[ 0 ] , GL_STATIC_DRAW) ;
glEnableVertexAttribArray( 1 ) ;
glVertexAttribPointer(
1 , // index: the index of the attribute to be modified
2 , // size: the number of components per attribute
GL_FLOAT, // type: the data type of each component
GL_FALSE, // normalized: whether or not to normalize data points
0 , // stride: the byte offset between attributes
( void * ) 0 // pointer: the offset of the first component of the first array attribute
) ;
//glVertexAttribDivisor(1, 0); // Advance by '1' on vertex attribute array '0'.
//glVertexAttribDivisor(1, 1); // Advance by '1' on vertex attribute array '1'.
glDrawArrays( GL_TRIANGLES, 0 , GLsizei( vecAllAsteroids_pos.size ( ) ) ) ;
glDisableVertexAttribArray( 0 ) ;
glDisableVertexAttribArray( 1 ) ;
/* ASTEROIDS ONLY */
frc.log ( ) ;
std:: stringstream ss;
ss << frc.get ( ) ;
PrintText( ss.str ( ) .c_str ( ) , 10 , 860 , 30 ) ;
glfwSwapBuffers( window) ;
glfwPollEvents( ) ;
vecAllParticles.clear ( ) ;
vecAllRegulars.clear ( ) ;
vecAllAsteroids_pos.clear ( ) ;
vecAllAsteroids_tex.clear ( ) ;
return 0 ;
}
CS8qIEFTVEVST0lEUyBPTkxZICovCgoJZm9yIChzdGQ6OnZlY3RvcjxSZW5kZXJPYmplY3QgKj46Oml0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IGl0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytpdGVyKSB7CgoJCVJlbmRlck9iamVjdCAqIG9iaiA9ICppdGVyOwoKCQlpZiAoZHluYW1pY19jYXN0PEFzdGVyb2lkICo+KG9iaikgPT0gTlVMTCkgewoJCQljb250aW51ZTsKCQl9CgoJCS8vIEdldCB0aGUgb3JpZ2luYWwgdW50cmFuc2Zvcm1lZCBtb2RlbC4KCQlzdGQ6OnZlY3RvcjxnbG06OnZlYzM+IHZlY01vZGVsID0gb2JqLT5Nb2RlbDsKCgkJZmxvYXQgYW5nbGUgPSBvYmotPlByb3BzLlBvcy5BbmdsZTsKCgkJZ2xtOjptYXQ0IHRyYW5zbCA9IGdsbTo6dHJhbnNsYXRlKGdsbTo6bWF0NCgxLjBmKSwgZ2xtOjp2ZWMzKG9iai0+UHJvcHMuUG9zLlgsIG9iai0+UHJvcHMuUG9zLlksIDAuMGYpKTsKCgkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWNNb2RlbC5zaXplKCk7IGkrKykgewoKCQkJZ2xtOjp2ZWM0IHZlY190ZW1wID0gZ2xtOjp2ZWM0KHZlY01vZGVsW2ldLCAwLjBmKTsKCgkJCXZlY190ZW1wID0gZ2xtOjp2ZWM0KGdsbTo6cm90YXRlWihnbG06OnZlYzModmVjX3RlbXBbMF0sIHZlY190ZW1wWzFdLCB2ZWNfdGVtcFszXSksIC1hbmdsZSksIDAuMGYpOwoKCQkJdmVjX3RlbXAgPSB0cmFuc2wgKiBnbG06OnZlYzQodmVjX3RlbXBbMF0sIHZlY190ZW1wWzFdLCB2ZWNfdGVtcFsyXSwgMS4wZik7IC8vIFRoZSAiMS4wZiIgYXQgdGhlIGVuZCBpcyBpbXBvcnRhbnQhCgoJCQl2ZWNBbGxBc3Rlcm9pZHNfcG9zLnB1c2hfYmFjayhnbG06OnZlYzIodmVjX3RlbXBbMF0sIHZlY190ZW1wWzFdKSk7CgkJfQoKCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY01vZGVsLnNpemUoKTsgaSA9IGkgKyAzKSB7CgoJCQl2ZWNBbGxBc3Rlcm9pZHNfdGV4LnB1c2hfYmFjayhnbG06OnZlYzIoMC4wZiwgMC4wZikpOwoJCQl2ZWNBbGxBc3Rlcm9pZHNfdGV4LnB1c2hfYmFjayhnbG06OnZlYzIoMC4wZiwgMS4wZikpOwoJCQl2ZWNBbGxBc3Rlcm9pZHNfdGV4LnB1c2hfYmFjayhnbG06OnZlYzIoMS4wZiwgMS4wZikpOwoJCX0KCX0KCglhc3NlcnQodmVjQWxsQXN0ZXJvaWRzX3Bvcy5zaXplKCkgPT0gdmVjQWxsQXN0ZXJvaWRzX3RleC5zaXplKCkpOwoKCWdsVXNlUHJvZ3JhbShhc3Rlcm9pZF9wcm9nX2lkKTsKCglnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwoJZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBhc3Rlcm9pZF90ZXhfaWQpOwoJZ2xVbmlmb3JtMWkoYXN0ZXJvaWRfdW5pZm9ybV9pZCwgMCk7CgoJZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgYXN0ZXJvaWRfdmVydGV4X2J1ZmZlcik7CglnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCB2ZWNBbGxBc3Rlcm9pZHNfcG9zLnNpemUoKSAqIHNpemVvZihnbG06OnZlYzIpLCAmdmVjQWxsQXN0ZXJvaWRzX3Bvc1swXSwgR0xfU1RBVElDX0RSQVcpOwoKCWdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7CglnbFZlcnRleEF0dHJpYlBvaW50ZXIoCgkJMCwgICAgICAgICAgICAgICAgICAvLyBpbmRleDogdGhlIGluZGV4IG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgbW9kaWZpZWQKCQkyLCAgICAgICAgICAgICAgICAgIC8vIHNpemU6IHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBwZXIgYXR0cmlidXRlCgkJR0xfRkxPQVQsICAgICAgICAgICAvLyB0eXBlOiB0aGUgZGF0YSB0eXBlIG9mIGVhY2ggY29tcG9uZW50CgkJR0xfRkFMU0UsICAgICAgICAgICAvLyBub3JtYWxpemVkOiB3aGV0aGVyIG9yIG5vdCB0byBub3JtYWxpemUgZGF0YSBwb2ludHMKCQkwLCAgICAgICAgICAgICAgICAgIC8vIHN0cmlkZTogdGhlIGJ5dGUgb2Zmc2V0IGJldHdlZW4gYXR0cmlidXRlcwoJCSh2b2lkKikwCQkJLy8gcG9pbnRlcjogdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBmaXJzdCBhcnJheSBhdHRyaWJ1dGUKCSk7CgoJZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgYXN0ZXJvaWRfdGV4dHVyZV9idWZmZXIpOwoJZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgdmVjQWxsQXN0ZXJvaWRzX3RleC5zaXplKCkgKiBzaXplb2YoZ2xtOjp2ZWMyKSwgJnZlY0FsbEFzdGVyb2lkc190ZXhbMF0sIEdMX1NUQVRJQ19EUkFXKTsKCglnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpOwoJZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKAoJCTEsICAgICAgICAgICAgICAgICAgLy8gaW5kZXg6IHRoZSBpbmRleCBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIG1vZGlmaWVkCgkJMiwgICAgICAgICAgICAgICAgICAvLyBzaXplOiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgcGVyIGF0dHJpYnV0ZQoJCUdMX0ZMT0FULCAgICAgICAgICAgLy8gdHlwZTogdGhlIGRhdGEgdHlwZSBvZiBlYWNoIGNvbXBvbmVudAoJCUdMX0ZBTFNFLCAgICAgICAgICAgLy8gbm9ybWFsaXplZDogd2hldGhlciBvciBub3QgdG8gbm9ybWFsaXplIGRhdGEgcG9pbnRzCgkJMCwgICAgICAgICAgICAgICAgICAvLyBzdHJpZGU6IHRoZSBieXRlIG9mZnNldCBiZXR3ZWVuIGF0dHJpYnV0ZXMKCQkodm9pZCAqKTAJCQkvLyBwb2ludGVyOiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIGZpcnN0IGFycmF5IGF0dHJpYnV0ZQoJKTsKCgkvL2dsVmVydGV4QXR0cmliRGl2aXNvcigxLCAwKTsgLy8gQWR2YW5jZSBieSAnMScgb24gdmVydGV4IGF0dHJpYnV0ZSBhcnJheSAnMCcuCgkvL2dsVmVydGV4QXR0cmliRGl2aXNvcigxLCAxKTsgLy8gQWR2YW5jZSBieSAnMScgb24gdmVydGV4IGF0dHJpYnV0ZSBhcnJheSAnMScuCgoJZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgR0xzaXplaSh2ZWNBbGxBc3Rlcm9pZHNfcG9zLnNpemUoKSkpOwoKCWdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KDApOwoJZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoMSk7CgoJLyogQVNURVJPSURTIE9OTFkgKi8KCglmcmMubG9nKCk7CgoJc3RkOjpzdHJpbmdzdHJlYW0gc3M7CgoJc3MgPDwgZnJjLmdldCgpOwoKCVByaW50VGV4dChzcy5zdHIoKS5jX3N0cigpLCAxMCwgODYwLCAzMCk7CgoJZ2xmd1N3YXBCdWZmZXJzKHdpbmRvdyk7CglnbGZ3UG9sbEV2ZW50cygpOwoKCXZlY0FsbFBhcnRpY2xlcy5jbGVhcigpOwoJdmVjQWxsUmVndWxhcnMuY2xlYXIoKTsKCXZlY0FsbEFzdGVyb2lkc19wb3MuY2xlYXIoKTsKCXZlY0FsbEFzdGVyb2lkc190ZXguY2xlYXIoKTsKCglyZXR1cm4gMDsKCn0=