void SpriteBatch::DrawAgent(Agent* a_agent) { Vec2 pos = a_agent->m_pos; float width = (float)m_agentWidth; float height = (float)m_agentHeight; int xOff = (int)width / 2; int yOff = (int)height / 2; Vec2 tl = Vec2(-xOff, -yOff); Vec2 tr = Vec2(xOff , -yOff); Vec2 br = Vec2(-xOff, yOff); Vec2 bl = Vec2(xOff , yOff); float rot = Vec2(0,1).GetAngleBetween(a_agent->m_heading); //create matrix for start point Mat3 rotMat; rotMat.Rotate(rot + 3.141592654); rotMat.SetTranslation(pos); //set the 4 vert points to correct rotation tl = rotMat.TransformPoint(tl); tr = rotMat.TransformPoint(tr); br = rotMat.TransformPoint(br); bl = rotMat.TransformPoint(bl); processSprite(&tl, &tr, &bl, &br, m_agentIBO, m_agentVBO, m_texID_agent, SPRITE_COLOUR_WHITE); }
//Draw Line void SpriteBatch::DrawLine(Vec2 a_start, Vec2 a_end, SPRITE_COLOUR a_col, float a_width) { //width used to offsetting float width; if(a_width > 0) width = a_width; else width = (float)m_line_width / 2; //width override for debugging //width = 50; float size = (a_start - a_end).Length(); Vec2 origin = Vec2(-width / 2, 0); //set the line around the zero point with the pivot //at the top center (0,0) //oriented for rotation zero along the x axis Vec2 tl = Vec2(0, 0) + origin; Vec2 tr = Vec2(width, 0) + origin; Vec2 br = Vec2(0, size) + origin; Vec2 bl = Vec2(width, size) + origin; //get difference normalised // Vec2 diff = Vec2(a_end.x - a_start.x, a_end.y - a_start.y).GetNormalised(); Vec2 diff = (a_start - a_end).GetNormalised(); float rot = Vec2(0,1).GetAngleBetween(diff); //create matrix for start point Mat3 rotMat; rotMat.Rotate(rot + 3.141592654); rotMat.SetTranslation(a_start); //transform line start point tl = rotMat.TransformPoint(tl); tr = rotMat.TransformPoint(tr); //transform line end point br = rotMat.TransformPoint(br); bl = rotMat.TransformPoint(bl); processSprite(&tl, &tr, &bl, &br, m_lineIBO, m_lineVBO, m_texID_line, a_col); }
void SpriteBatch::DrawSprite(unsigned int VBO, unsigned int IBO, unsigned int programID, unsigned int textureID , unsigned int projectionLoc, float *projectionMat, Mat3 &matrix, float a_width, float a_height, int rotatePoint, Vec2 a_pivot) { //make sure we are drawing the current width of the object multiplied against the scale //otherwise changing the scale of the Mat3 isn't taken into account when drawing. float width = a_width * matrix.GetRightScale(); float height = a_height * matrix.GetUpScale(); Vec2 tl = Vec2(0, 0) + a_pivot; Vec2 tr = Vec2(width, 0) + a_pivot; Vec2 br = Vec2(0, height) + a_pivot; Vec2 bl = Vec2(width, height) + a_pivot; //set the 4 vert points to correct rotation tl = matrix.TransformPoint(tl); tr = matrix.TransformPoint(tr); br = matrix.TransformPoint(br); bl = matrix.TransformPoint(bl); Vertex vertexData[4] = { Vertex(tl.x, tl.y, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f), Vertex(tr.x, tr.y, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f), Vertex(bl.x, bl.y, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f), Vertex(br.x, br.y, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f) }; GLubyte indices[6] = { 0, 1, 2, // first triangle 0, 2, 3 // second triangle }; glUseProgram(programID); //std::cout << glGetError() << std::endl; // bind our texture to active texture 0... glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textureID); int textureLocation = glGetUniformLocation(programID, "myTextureSampler"); glUniform1i(textureLocation , 1 ); //send our orthographic projection info to the shader glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, projectionMat); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); //allocate space for vertices on the graphics card glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*4, vertexData, GL_STREAM_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte)*6, indices, GL_STREAM_DRAW); //enable the vertex array state, since we're sending in an array of vertices glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)16); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)32); //glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float)*8)); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL); // glDrawArrays(GL_QUADS, 0, 4); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0); //debug collision circles by displaying them //note that collision code should match this method for positions collision circles to be correct //create a posiiton around the world 0 point for the centre of the object to transform from // Vec2 drawPos = Vec2((width / 2) + a_pivot.x, (height / 2) + a_pivot.y); // // //transform the circle point to where it needs to go // drawPos = matrix.TransformPoint(drawPos); // // float radius = getRadius(width, height, matrix.GetRightScale()); // //draw the circle // DrawCircle(drawPos.x, drawPos.y, radius, 12, projectionLoc, projectionMat); // }