void InventoryEquipment::reload() { m_slots.clear(); const sf::Texture* tex = g_resourceManager->getTexture(ResourceID::Texture_equipmentplaceholders); std::vector<ItemType> types; types.push_back(ItemType::Equipment_weapon); types.push_back(ItemType::Equipment_head); types.push_back(ItemType::Equipment_neck); types.push_back(ItemType::Equipment_body); types.push_back(ItemType::Equipment_back); types.push_back(ItemType::Equipment_ring_1); types.push_back(ItemType::Equipment_ring_2); sf::Vector2i texPos(0, 0); float xOffset = GUIConstants::LEFT + ((WIDTH - InventorySlot::SIZE) / 2.f); float yOffset = GUIConstants::TOP + YOFFSET; for (auto& it : types) { if (m_core->getEquippedItem(it) == nullptr) { m_slots.insert({ it, InventorySlot(tex, texPos) }); } else { m_slots.insert({ it, InventorySlot(*(m_core->getEquippedItem(it)), -1) }); } texPos.x += 50; m_slots.at(it).setItemType(it); m_slots.at(it).setPosition(sf::Vector2f(xOffset, yOffset)); yOffset += InventorySlot::SIZE + MARGIN; } }
// run int Menu::run(){ int dy = 0; js = SDL_JoystickOpen(0); bool b1 = glIsEnabled(GL_LIGHTING); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); glLoadIdentity(); currentSelection = 0; Uint32 start; SDL_Event event; int MENU_FLAG = 0; while(true){ start = SDL_GetTicks(); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); test(); while(SDL_PollEvent(&event)){ switch(event.type){ case SDL_KEYDOWN: switch(event.key.keysym.sym){ case SDLK_ESCAPE: if(b1) glEnable(GL_LIGHTING); glColor3f(1,1,1); return 1; break; case SDLK_UP: currentSelection--; if(currentSelection < 0) currentSelection = planes.size()-1; break; case SDLK_DOWN: currentSelection++; if(currentSelection > planes.size() -1) currentSelection = 0; break; case SDLK_RETURN: if(b1) glEnable(GL_LIGHTING); glColor3f(1,1,1); return currentSelection; break; } break; // Joystick Axis case SDL_JOYAXISMOTION: dy = SDL_JoystickGetAxis(js, 1); if(event.jaxis.value < -3200 || event.jaxis.value > 3200){ if(event.jaxis.axis == 1){ if(dy <= 1){ currentSelection--; if(currentSelection < 0) currentSelection = planes.size()-1; break; }else{ currentSelection++; if(currentSelection > planes.size() -1) currentSelection = 0; break; } } } break; case SDL_JOYBUTTONDOWN: if (event.jbutton.button == 0){ return currentSelection; } break; } } glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,background); glColor3f(1,1,1); glBegin(GL_QUADS); glTexCoord2f(0.0,0.0); glVertex3f(backPosition->getPlaneVertex1().x, backPosition->getPlaneVertex1().y, backPosition->getPlaneVertex1().z); glTexCoord2f(0.0,1.0); glVertex3f(backPosition->getPlaneVertex2().x, backPosition->getPlaneVertex2().y, backPosition->getPlaneVertex2().z); glTexCoord2f(1.0,1.0); glVertex3f(backPosition->getPlaneVertex3().x, backPosition->getPlaneVertex3().y, backPosition->getPlaneVertex3().z); glTexCoord2f(1.0,0.0); glVertex3f(backPosition->getPlaneVertex4().x, backPosition->getPlaneVertex4().y, backPosition->getPlaneVertex4().z); // glVertex3f(-1,1,-2); // glVertex3f(-1,-1,-2); // glVertex3f(1,-1,-2); // glVertex3f(1,1,-2); glEnd(); glDisable(GL_TEXTURE_2D); std::cout << currentSelection << std::endl; for(int i=0;i < planes.size(); i++){ if(i == currentSelection){ std::cout << "i n" << std::endl; glBegin(GL_QUADS); glColor3f(1,0,0); glVertex3f(planes[i].getPlaneVertex1().x, planes[i].getPlaneVertex1().y + 0.04, planes[i].getPlaneVertex1().z); glColor3f(0,0,0); glVertex3f(planes[i].getPlaneVertex1().x, planes[i].getPlaneVertex1().y, planes[0].getPlaneVertex1().z); glVertex3f(planes[i].getPlaneVertex1().x +strings[i].length() * 0.032, planes[i].getPlaneVertex1().y, planes[i].getPlaneVertex1().z); glColor3f(1,0,0); glVertex3f(planes[i].getPlaneVertex1().x + strings[i].length() * 0.032,planes[i].getPlaneVertex1().y + 0.04, planes[i].getPlaneVertex1().z); glEnd(); } glColor3f(0,0,0); Vector3d texPos(planes[i].getPlaneVertex1().getX() + .01, (planes[i].getPlaneVertex1().getY() + .01), planes[i].getPlaneVertex1().getZ()); text->drawText(texPos, Vector3d(0, 0, 0), Vector3d(0.035, 0.035, 0.035), strings[i].c_str()); } SDL_GL_SwapBuffers(); if(1000/30>(SDL_GetTicks() - start)) SDL_Delay(1000/30-(SDL_GetTicks() - start)); } return 0; }
void BGNode::drawFace(ofShader & mEyeShader) { /* int n = neighbours.size(); ofVec2f toVector(1,0); if(n > 0) toVector = (neighbours[0]->position - position).normalize(); ofVec2f perpVec(-toVector.y, toVector.x); */ ofSetColor(255); float offset = .05 * nodeRadius; float perpOffset = .6 * nodeRadius; float eyeRadius = .6 * nodeRadius; ofVec2f toVector = mSurfaceNormal; ofVec2f perpVec(-toVector.y, toVector.x); ofVec2f goalPos = position; if(neighbours.size() > 0) goalPos = neighbours[0]->position; float texFactor = .6 * nodeRadius; for(int i=0; i<2; ++i) { int factor = i == 0 ? 1 : -1; ofVec2f pos = position + toVector * offset + factor * perpVec * perpOffset; ofMesh eyeMesh; eyeMesh.setMode(OF_PRIMITIVE_TRIANGLE_STRIP); for(int j=0; j<4; ++j) { ofVec2f texPos(j % 2, j / 2); ofVec2f vPos = pos + (texPos.x - .5) * texFactor * perpVec + (texPos.y - .5) * texFactor * toVector; eyeMesh.addVertex(ofVec3f(vPos.x, vPos.y, 0)); eyeMesh.addTexCoord(texPos); } ofVec2f goalPos = position; if(neighbours.size() > 0) goalPos = neighbours[0]->position; ofVec2f toGoal = goalPos - pos; float toGoalLength = toGoal.length(); ofVec2f pupilPos = pos; if(toGoalLength > 0.01) pupilPos = pos + .25 * eyeRadius / toGoalLength * toGoal; mEyeShader.begin(); mEyeShader.setUniform2f("uCenter", pos.x, pos.y); mEyeShader.setUniform2f("uFocusPoint", goalPos.x, goalPos.y); mEyeShader.setUniform2f("uPupilLoc", pupilPos.x, pupilPos.y); mEyeShader.setUniform1i("uFlipHorizontally", i > 0); eyeMesh.draw(); mEyeShader.end(); } ofMesh mouthMesh; mouthMesh.setMode(OF_PRIMITIVE_TRIANGLE_STRIP); for(int i=0; i<21; ++i) { float t = i / 20.0; float x = .6 * (t - .5) * nodeRadius; float yVar = 2 * abs(t - .5); float y = (-yVar * yVar * (1 - yVar) * .6 - .3) * nodeRadius; for(int it=0; it<2; ++it) { mouthMesh.addVertex(position + y * toVector + x * perpVec); mouthMesh.addColor(ofColor(0)); y -= 3; } } mouthMesh.draw(); }
// returns whether the shape was drawn eBool eLSystem::drawShapes(eMesh& destMesh, tDrawState& state, const tTurtleState& turtle0, const tTurtleState& turtle1, eF32 shapeLen, eF32 stexY0, eF32 stexY1, eBool forceDraw, eU32 numParts) { eF32 partLen = eLerp(this->m_sizePar * (eF32)numParts, 0.0001f, detail); // eF32 partLen = eLerp(eF32_MAX, 0.0001f, detail); if(partLen <= 0.0f) partLen = eALMOST_ZERO; eF32 numToDrawF = (eF32)shapeLen / partLen; if(!forceDraw) { if(numToDrawF <= 1.0f) return false; } eU32 numDraw = eCeil(eClamp(1.0f, numToDrawF, (eF32)m_gen_rings)); eU32 numFaces = numDraw * m_gen_edges * 2; eU32 faceNr = 0; ePROFILER_ZONE("L-System - Draw Shapes"); __declspec(align(16)) const eVector3 control0 = turtle0.position; __declspec(align(16)) const eVector3 control1 = control0 + turtle0.rotation.getVector(2) * 0.333333f * shapeLen; __declspec(align(16)) const eVector3 control3 = turtle1.position; __declspec(align(16)) const eVector3 control2 = control3 - turtle1.rotation.getVector(2) * 0.333333f * shapeLen; eF32 rscale0 = turtle0.size * turtle0.width; eF32 rscale1 = turtle1.size * turtle1.width; for(eU32 d = 0; d < numDraw; d++) { eF32 t0 = ((eF32)d / (eF32)numDraw); eF32 t1 = ((eF32)(d + 1) / (eF32)numDraw); for(eU32 r = 0; r <= 1; r++) { eF32 tt = (r == 0) ? t0 : t1; eF32 rscale = eLerp(rscale0, rscale1, tt); if((r != 0) || (state.lastVertices->size() == 0)) { // create ring vertices __declspec(align(16)) eVector3 position; __declspec(align(16)) eVector3 normal; // calculate bezier curve position __m128 mt = _mm_set1_ps(tt); __m128 mtinv = _mm_set1_ps(1.0f - tt); __m128 mcp0 = _mm_load_ps(&control0.x); __m128 mcp1 = _mm_load_ps(&control1.x); __m128 m0 = _mm_add_ps(_mm_mul_ps(mcp0, mtinv), _mm_mul_ps(mcp1, mt)); __m128 mcp2 = _mm_load_ps(&control2.x); __m128 m1 = _mm_add_ps(_mm_mul_ps(mcp1, mtinv), _mm_mul_ps(mcp2, mt)); __m128 mm0 = _mm_add_ps(_mm_mul_ps(m0, mtinv), _mm_mul_ps(m1, mt)); __m128 mcp3 = _mm_load_ps(&control3.x); __m128 m2 = _mm_add_ps(_mm_mul_ps(mcp2, mtinv), _mm_mul_ps(mcp3, mt)); __m128 mm1 = _mm_add_ps(_mm_mul_ps(m1, mtinv), _mm_mul_ps(m2, mt)); __m128 bezCurvePosition = _mm_add_ps(_mm_mul_ps(mm0, mtinv), _mm_mul_ps(mm1, mt)); // calculate bezier tangent __m128 vec3mask = _mm_set_ps(0x0,0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF); __m128 mrestangent = _mm_and_ps(_mm_sub_ps(mm1, mm0), vec3mask); __m128 mdot = _mm_mul_ps(mrestangent, mrestangent); __m128 mdotagg = _mm_hadd_ps(mdot, mdot); __m128 recipsqrt = _mm_rsqrt_ss( _mm_hadd_ps(mdotagg, mdotagg) ); __m128 tangentnorm = _mm_mul_ps(mrestangent, _mm_shuffle_ps(recipsqrt, recipsqrt, _MM_SHUFFLE(0,0,0,0))); // get look vector on axis 2 (ringRot.getVector(2)) eQuat ringRot = turtle0.rotation.slerp(tt, turtle1.rotation); __m128 mRingRot = _mm_loadu_ps((eF32*)&ringRot); __m128 rrmulparts = _mm_mul_ps(mRingRot, _mm_shuffle_ps(mRingRot, mRingRot, _MM_SHUFFLE(0,1,3,2))); __m128 ringRotSqr = _mm_mul_ps(mRingRot, mRingRot); __m128 mrdotagg = _mm_hadd_ps(rrmulparts, ringRotSqr); __m128 mrdotaggshuf = _mm_shuffle_ps(mrdotagg, mrdotagg, _MM_SHUFFLE(0,2,0,2)); __m128 mrrotz = _mm_hsub_ps(rrmulparts, mrdotaggshuf); __m128 rrecipsqrt = _mm_rsqrt_ss( _mm_hadd_ps(mrdotagg, mrdotagg) ); __m128 maxisparts = _mm_shuffle_ps(mrrotz,mrdotagg, _MM_SHUFFLE(0,2,0,2)); // -Y-X __m128 maxisparts2 = _mm_add_ps(maxisparts, maxisparts); // -Y*2-X*2 __m128 maxispartsfinal = _mm_shuffle_ps(mrrotz,maxisparts2,_MM_SHUFFLE(0,0,2,0)); //ZZY*2X*2 __m128 mlook = _mm_and_ps(_mm_mul_ps(maxispartsfinal, _mm_shuffle_ps(rrecipsqrt, rrecipsqrt, _MM_SHUFFLE(0,0,0,0))), vec3mask); // calculate side vector (look ^ tangent) __m128 mside = _mm_sub_ps( _mm_mul_ps(_mm_shuffle_ps(mlook, mlook, _MM_SHUFFLE(3, 0, 2, 1)), _mm_shuffle_ps(tangentnorm, tangentnorm, _MM_SHUFFLE(3, 1, 0, 2))), _mm_mul_ps(_mm_shuffle_ps(mlook, mlook, _MM_SHUFFLE(3, 1, 0, 2)), _mm_shuffle_ps(tangentnorm, tangentnorm, _MM_SHUFFLE(3, 0, 2, 1))) ); // normalize side vector mdot = _mm_mul_ps(mside, mside); mdotagg = _mm_hadd_ps(mdot, mdot); __m128 dotsum = _mm_hadd_ps(mdotagg, mdotagg); const eF32 sideLenSqr = dotsum.m128_f32[0]; if(sideLenSqr > eALMOST_ZERO) { recipsqrt = _mm_rsqrt_ss( dotsum ); __m128 sidenorm = _mm_mul_ps(mside, _mm_shuffle_ps(recipsqrt, recipsqrt, _MM_SHUFFLE(0,0,0,0))); // calc dot product (look * tangent) __m128 dotprod = _mm_mul_ps(mlook, sidenorm); __m128 dph0 = _mm_hadd_ps(dotprod, dotprod); __m128 dph1 = _mm_hadd_ps(dph0, dph0); const eF32 dot = eClamp(-1.0f, dph1.m128_f32[0], 1.0f); eF32 alpha = eACos(dot) * (1.0f / (2.0f * ePI)); eQuat rotation(sidenorm, alpha); ringRot = rotation * ringRot; } eMatrix4x4 curveMat(ringRot); __declspec(align(16)) eVector3 ringX = curveMat.getVector(0); __declspec(align(16)) eVector3 ringY = curveMat.getVector(1); eF32 texY = eLerp(stexY0, stexY1, tt); const eF32 texXStep = 1.0f / m_gen_edges; eVector2 texPos(0, texY); __m128 mRingX = _mm_load_ps(&ringX.x); __m128 mRingY = _mm_load_ps(&ringY.x); __m128 mScale = _mm_set1_ps(rscale); for(eU32 e = 0; e <= m_gen_edges * 2; e += 2) { __m128 msin = _mm_set1_ps(m_gen_edge_sinCosTable[e]); __m128 mcos = _mm_set1_ps(m_gen_edge_sinCosTable[e+1]); __m128 mnormal = _mm_add_ps(_mm_mul_ps(mRingX, msin), _mm_mul_ps(mRingY, mcos)); _mm_store_ps(&normal.x, mnormal); __m128 mposition = _mm_add_ps(bezCurvePosition, _mm_mul_ps(mnormal, mScale)); _mm_store_ps(&position.x, mposition); state.curVertices->append(destMesh.addVertex(position, normal, texPos)); texPos.x += texXStep; } // connect triangles if(r != 0) { eF32 texY0 = eLerp(stexY0, stexY1, t0); eF32 texY1 = eLerp(stexY0, stexY1, t1); for(eU32 e = 0; e < m_gen_edges; e++) { destMesh.addTriangleFast((*state.curVertices)[e], (*state.curVertices)[e + 1], (*state.lastVertices)[e + 1], m_gen_materials_dsIdx[turtle0.polyMatIdx]); destMesh.addTriangleFast((*state.curVertices)[e], (*state.lastVertices)[e + 1], (*state.lastVertices)[e], m_gen_materials_dsIdx[turtle0.polyMatIdx]); } } state.lastVertices = state.curVertices; eSwap(state.curVertices, state.curTempVertices); state.curVertices->clear(); } } } return true; }