void TerrainTilesPanel::RenderBox(const ion::Vector2i& pos, const ion::Vector2& size, const ion::Colour& colour, ion::render::Renderer& renderer, const ion::Matrix4& cameraInverseMtx, const ion::Matrix4& projectionMtx, float z) { const int tileWidth = m_project.GetPlatformConfig().tileWidth; const int tileHeight = m_project.GetPlatformConfig().tileHeight; const int quadHalfExtentsX = 4; const int quadHalfExtentsY = 4; float bottom = (m_canvasSize.y - (pos.y + size.y)); ion::Matrix4 boxMtx; ion::Vector3 boxScale(size.x, size.y, 0.0f); ion::Vector3 boxPos(floor((pos.x - (m_canvasSize.x / 2.0f) + (boxScale.x / 2.0f)) * tileWidth), floor((bottom - (m_canvasSize.y / 2.0f) + (boxScale.y / 2.0f)) * tileHeight), z); boxMtx.SetTranslation(boxPos); boxMtx.SetScale(boxScale); ion::render::Material* material = m_renderResources.GetMaterial(RenderResources::eMaterialFlatColour); renderer.SetAlphaBlending(ion::render::Renderer::eTranslucent); material->SetDiffuseColour(colour); material->Bind(boxMtx, cameraInverseMtx, projectionMtx); renderer.DrawVertexBuffer(m_selectionPrimitive->GetVertexBuffer(), m_selectionPrimitive->GetIndexBuffer()); material->Unbind(); renderer.SetAlphaBlending(ion::render::Renderer::eNoBlend); }
void Player::update(float dt) { Rect rect = m_model->realBoundingBoxForCurrentFrame(); Vec3 scale, pos; Quaternion rot; getNodeToWorldTransform().decompose(&scale, &rot, &pos); do { Node* level = Director::getInstance()->getRunningScene()->getChildByTag(1); if (level == nullptr) { break; } Vec2 position = level->getPosition(); if (m_state == EWalkLeft) { position += dt * m_speed * Vec2(scale.x, 0); } else if (m_state == EWalkRight) { position += dt * m_speed * Vec2(-scale.x, 0); } else { break; } level->setPosition(position); } while (0); Size boxSize(rect.size.width * scale.x, rect.size.height * scale.y); Vec2 boxPos(rect.origin.x * scale.x + boxSize.width / 2, rect.origin.y * scale.y + boxSize.height / 2); auto body = PhysicsBody::createBox(boxSize, PHYSICSBODY_MATERIAL_DEFAULT); body->setPositionOffset(boxPos); setPhysicsBody(body); body->setContactTestBitmask(0x2); }
static void CreateStack( hkpWorld* world, int size, float zPos = 0.0f ) { const hkReal cubeSize = 1.0f; // This is the size of the cube side of the box const hkReal boxRadius = cubeSize * 0.01f; const hkReal gapx = cubeSize * 0.05f; // This is the gap between boxes const hkReal gapy = boxRadius; const hkReal heightOffGround = 0.0f; // This is the height of the BenchmarkSuite off the gound hkReal extendedBoxDimX = cubeSize + gapx; hkReal extendedBoxDimY = cubeSize + gapy; hkVector4 startPos( 0.0f , heightOffGround + gapy + cubeSize * 0.5f, zPos); // Build BenchmarkSuite { hkVector4 boxRadii(cubeSize *.5f, cubeSize *.5f, cubeSize *.5f); hkpShape* boxShape = new hkpBoxShape( boxRadii , boxRadius ); for(int i=0; i<size; i++) { // This constructs a row, from left to right int rowSize = size - i; hkVector4 start(-rowSize * extendedBoxDimX * 0.5f + extendedBoxDimX * 0.5f, i * extendedBoxDimY, 0); for(int j=0; j< rowSize; j++) { hkVector4 boxPos(start); hkVector4 shift(j * extendedBoxDimX, 0.0f, 0.0f); boxPos.setAdd4(boxPos, shift); boxPos.setAdd4(boxPos, startPos); /// hkpRigidBodyCinfo boxInfo; boxInfo.m_mass = 100.0f; // calculate the correct inertia hkReal d = boxInfo.m_mass * cubeSize * cubeSize / 6.0f; // for small boxes increase inertia slightly if ( boxRadius < 0.1f ) { d *= 2.0f; if ( boxRadius < 0.03f ) { d *= 2.0f; } } boxInfo.m_inertiaTensor.setDiagonal(d,d,d); boxInfo.m_shape = boxShape; boxInfo.m_motionType = hkpMotion::MOTION_DYNAMIC; boxInfo.m_position = boxPos; boxInfo.m_restitution = 0.5f; boxInfo.m_friction = 0.6f; boxInfo.m_solverDeactivation = hkpRigidBodyCinfo::SOLVER_DEACTIVATION_MAX; ///> hkpRigidBody* boxRigidBody = new hkpRigidBody(boxInfo); // Now add to world. Body is "ready to go" as soon as this is called, and display // is (as a registered listener) automatically notified to build a new display object. world->addEntity( boxRigidBody ); boxRigidBody->removeReference(); // Remove reference, since we no longer want to remember this } } boxShape->removeReference(); } }