/*----------------------------------------------------------------------------------------------- Description: Governs window creation, the initial OpenGL configuration (face culling, depth mask, even though this is a 2D demo and that stuff won't be of concern), the creation of geometry, and the creation of a texture. Parameters: argc (From main(...)) The number of char * items in argv. For glut's initialization. argv (From main(...)) A collection of argument strings. For glut's initialization. Returns: False if something went wrong during initialization, otherwise true; Exception: Safe Creator: John Cox (3-7-2016) -----------------------------------------------------------------------------------------------*/ void Init() { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glDepthFunc(GL_LEQUAL); glDepthRange(0.0f, 1.0f); gProgramId = GenerateShaderProgram(); gUnifMatrixTransform = glGetUniformLocation(gProgramId, "translateMatrixWindowSpace"); gUnifTextureSampler = glGetUniformLocation(gProgramId, "tex"); GenerateTriangle(&gTriangle); GenerateBox(&gBox); GenerateCircle(&gCircle); InitializeGeometry(gProgramId, &gTriangle); InitializeGeometry(gProgramId, &gBox); InitializeGeometry(gProgramId, &gCircle); gTexture1Id = CreateRandom3BeamTexture(); gTexture2Id = CreateRandom3BeamTexture(); gTexture3Id = CreateRandom3BeamTexture(); // the textures all share the same properties, so I'll use the same sampler for all gSamplerId = CreateGenericSampler(); }
CollisionApp::CollisionApp() : m_dTurn(0.0f) , m_moveRate(2.0f) , m_turnRate(2.0f) , m_playerMoving(false) { this->ToggleOutputWindow(false); Context::Init(Log); Window::WindowFactory windowFactory; Window::InitData windowData; windowData.isImGuiWindow = false; int appW(0), appH(0); GetWindowDimensions(appW, appH); windowData.width = appW; windowData.height = appH; windowData.clearColor = (vec4(0.0f, 0.0f, 0.0f, 1.0f)); m_pViewport = windowFactory.GetNewWindow(windowData); float margin = 0.5f; m_canvasDim = 10.0f; //Add boundary lines BoundaryLine bl; bl.line = Line(vec3(margin, margin, 1.0f), vec3(1.0f, 0.0f, 0.0f)); bl.length = m_canvasDim - 2.0f * margin; m_boundaryLines.push_back(bl); bl.line = Line(vec3(m_canvasDim - margin, margin, 1.0f), vec3(0.0f, 1.0f, 0.0f)); m_boundaryLines.push_back(bl); bl.line = Line(vec3(m_canvasDim - margin, m_canvasDim - margin, 1.0f), vec3(-1.0f, 0.0f, 0.0f)); m_boundaryLines.push_back(bl); bl.line = Line(vec3(margin, m_canvasDim - margin, 1.0f), vec3(0.0f, -1.0f, 0.0f)); m_boundaryLines.push_back(bl); float crossDim = 0.6f; vec3 crossCenter(5.0f, 5.0f, 1.0f); // Upper arm vec3 lo = crossCenter + vec3(crossDim, crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, vec3::yAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(crossDim, 4.0f * crossDim, 0.0f); bl.length = 2.0f * crossDim; bl.line = Line(lo, -vec3::xAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(-crossDim, 4.0f * crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, -vec3::yAxis()); m_boundaryLines.push_back(bl); // Left arm lo = crossCenter + vec3(-crossDim, crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, -vec3::xAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(-4.0f * crossDim, crossDim, 0.0f); bl.length = 2.0f * crossDim; bl.line = Line(lo, -vec3::yAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(-4.0f * crossDim, -crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, vec3::xAxis()); m_boundaryLines.push_back(bl); // Bottom arm lo = crossCenter + vec3(-crossDim, -crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, -vec3::yAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(-crossDim, -4.0f * crossDim, 0.0f); bl.length = 2.0f * crossDim; bl.line = Line(lo, vec3::xAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(crossDim, -4.0f * crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, vec3::yAxis()); m_boundaryLines.push_back(bl); // Right arm lo = crossCenter + vec3(crossDim, -crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, vec3::xAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(4.0f * crossDim, -crossDim, 0.0f); bl.length = 2.0f * crossDim; bl.line = Line(lo, vec3::yAxis()); m_boundaryLines.push_back(bl); lo = crossCenter + vec3(4.0f * crossDim, crossDim, 0.0f); bl.length = 3.0f * crossDim; bl.line = Line(lo, -vec3::xAxis()); m_boundaryLines.push_back(bl); //Boundary points vec3 bp = crossCenter + vec3(crossDim, 4.0f * crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(-crossDim, 4.0f * crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(-4.0f * crossDim, crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(-4.0f * crossDim, -crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(-crossDim, -4.0f * crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(crossDim, -4.0f * crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(4.0f * crossDim, -crossDim, 0.0f); m_boundaryPoints.push_back(bp); bp = crossCenter + vec3(4.0f * crossDim, crossDim, 0.0f); m_boundaryPoints.push_back(bp); //Player puck float playerRadius = 0.3f; m_player.disk.SetRadius(playerRadius); float playerOffset = margin + playerRadius + 0.1f; m_player.disk.SetCenter(vec3(playerOffset, playerOffset, 1.0f)); m_player.angle = 0.0f; //m_player.disk.SetCenter(vec3(0.799999952f, playerOffset, 1.0f)); //m_player.angle = 2.46666574f; m_player.speed = 0.0f; //------------------------------------------------------------------------------------ // Add drawables //------------------------------------------------------------------------------------ ScreenObject so; so.draw = true; Context::LineMesh player_lm = GenerateCircle(1.0f); player_lm.color.Set(1.0f, 0.0f, 0.0f, 1.0f); m_circleHandle = m_contextLine.AddObject(player_lm); m_drawables.insert(dItem(m_circleHandle, so)); player_lm.color.Set(1.0f, 0.5f, 0.0f, 1.0f); so.draw = false; m_circleHandleInt = m_contextLine.AddObject(player_lm); m_drawables.insert(dItem(m_circleHandleInt, so)); Context::LineMesh arrow_lm = GenerateArrow(); so.draw = true; arrow_lm.color.Set(1.0f, 0.0f, 0.0f, 1.0f); m_arrowHandle = m_contextLine.AddObject(arrow_lm); m_drawables.insert(dItem(m_arrowHandle, so)); arrow_lm.color.Set(1.0f, 0.5f, 0.0f, 1.0f); so.draw = false; m_arrowHandleInt = m_contextLine.AddObject(arrow_lm); m_drawables.insert(dItem(m_arrowHandleInt, so)); Context::LineMesh lm; lm.color.Set(1.0f, 0.0f, 0.0f, 1.0f); for (auto const & l : m_boundaryLines) { Context::LineVertex lv0, lv1; lv0.point[0] = l.line.Origin()[0]; lv0.point[1] = l.line.Origin()[1]; lv0.point[2] = 0.0f; lv0.point[3] = 1.0f; lv1.point[0] = l.line.Origin()[0] + l.length * l.line.Direction()[0]; lv1.point[1] = l.line.Origin()[1] + l.length * l.line.Direction()[1]; lv1.point[2] = 0.0f; lv1.point[3] = 1.0f; lm.verts.push_back(lv0); lm.verts.push_back(lv1); Context::Line l; l.indices[0] = lm.verts.size() - 1; l.indices[1] = lm.verts.size() - 2; lm.lines.push_back(l); } mat4 scale, translation; scale.Scaling(2.0f / m_canvasDim); vec4 tvec(-1.0f, -1.0f, 0.0f, 0.0f); translation.Translation(tvec); m_transform = scale * translation; so.draw = true; m_drawables.insert(dItem(m_contextLine.AddObject(lm), so)); m_contextLine.CommitLoadList(); }