wxFontFace * wxFontBundleBase::GetFaceForFont(const wxFontMgrFontRefData& font) const { wxASSERT_MSG( font.GetFaceName().empty() || font.GetFaceName() == GetName(), _T("calling GetFaceForFont for incompatible font") ); int type = FaceType_Regular; if ( font.GetWeight() == wxBOLD ) type |= FaceType_Bold; // FIXME -- this should read "if ( font->GetStyle() == wxITALIC )", // but since MGL neither DFB supports slant, we try to display it with // italic face (better than nothing...) if ( font.GetStyle() == wxITALIC || font.GetStyle() == wxSLANT ) { if ( HasFace((FaceType)(type | FaceType_Italic)) ) type |= FaceType_Italic; } if ( !HasFace((FaceType)type) ) { for (int i = 0; i < FaceType_Max; i++) { if ( HasFace((FaceType)i) ) return GetFace((FaceType)i); } wxFAIL_MSG( _T("no face") ); return NULL; } return GetFace((FaceType)type); }
wxFontFace * wxFontBundleBase::GetFaceForFont(const wxFontMgrFontRefData& font) const { wxASSERT_MSG( font.GetFaceName().empty() || GetName().CmpNoCase(font.GetFaceName()) == 0, wxT("calling GetFaceForFont for incompatible font") ); int type = FaceType_Regular; if ( font.GetWeight() == wxBOLD ) type |= FaceType_Bold; // FIXME -- this should read "if ( font->GetStyle() == wxITALIC )", // but since DFB doesn't support slant, we try to display it with italic // face (better than nothing...) if ( font.GetStyle() == wxITALIC || font.GetStyle() == wxSLANT ) { if ( HasFace((FaceType)(type | FaceType_Italic)) ) type |= FaceType_Italic; } if ( !HasFace((FaceType)type) ) { // if we can't get the exact font requested, substitute it with // some other variant: for (int i = 0; i < FaceType_Max; i++) { if ( HasFace((FaceType)i) ) return GetFace((FaceType)i); } wxFAIL_MSG( wxT("no face") ); return NULL; } return GetFace((FaceType)type); }
void CubeTileMesh::SetupFaceVertices(const RectF *textureAtlasTileBoundaries) { uint pos = 0; Vector3 a(-0.5f, -0.5f, -0.5f); Vector3 b(0.5f, 0.5f, 0.5f); if (HasFace(SIDE_TOP)) { pos = m_topFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(a.x, b.y, b.z)); m_vertices->SetNormal(pos, UP); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(b.x, b.y, b.z)); m_vertices->SetNormal(pos + 1, UP); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(a.x, b.y, a.z)); m_vertices->SetNormal(pos + 2, UP); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(b.x, b.y, b.z)); m_vertices->SetNormal(pos + 3, UP); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(b.x, b.y, a.z)); m_vertices->SetNormal(pos + 4, UP); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(a.x, b.y, a.z)); m_vertices->SetNormal(pos + 5, UP); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } if (HasFace(SIDE_BOTTOM)) { pos = m_bottomFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(b.x, a.y, b.z)); m_vertices->SetNormal(pos, DOWN); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(a.x, a.y, b.z)); m_vertices->SetNormal(pos + 1, DOWN); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(b.x, a.y, a.z)); m_vertices->SetNormal(pos + 2, DOWN); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(a.x, a.y, b.z)); m_vertices->SetNormal(pos + 3, DOWN); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(a.x, a.y, a.z)); m_vertices->SetNormal(pos + 4, DOWN); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(b.x, a.y, a.z)); m_vertices->SetNormal(pos + 5, DOWN); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } if (HasFace(SIDE_FRONT)) { pos = m_frontFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(b.x, a.y, a.z)); m_vertices->SetNormal(pos, FORWARD); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(a.x, a.y, a.z)); m_vertices->SetNormal(pos + 1, FORWARD); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(b.x, b.y, a.z)); m_vertices->SetNormal(pos + 2, FORWARD); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(a.x, a.y, a.z)); m_vertices->SetNormal(pos + 3, FORWARD); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(a.x, b.y, a.z)); m_vertices->SetNormal(pos + 4, FORWARD); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(b.x, b.y, a.z)); m_vertices->SetNormal(pos + 5, FORWARD); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } if (HasFace(SIDE_BACK)) { pos = m_backFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(a.x, a.y, b.z)); m_vertices->SetNormal(pos, BACKWARD); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(b.x, a.y, b.z)); m_vertices->SetNormal(pos + 1, BACKWARD); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(a.x, b.y, b.z)); m_vertices->SetNormal(pos + 2, BACKWARD); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(b.x, a.y, b.z)); m_vertices->SetNormal(pos + 3, BACKWARD); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(b.x, b.y, b.z)); m_vertices->SetNormal(pos + 4, BACKWARD); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(a.x, b.y, b.z)); m_vertices->SetNormal(pos + 5, BACKWARD); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } if (HasFace(SIDE_LEFT)) { pos = m_leftFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(a.x, a.y, a.z)); m_vertices->SetNormal(pos, LEFT); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(a.x, a.y, b.z)); m_vertices->SetNormal(pos + 1, LEFT); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(a.x, b.y, a.z)); m_vertices->SetNormal(pos + 2, LEFT); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(a.x, a.y, b.z)); m_vertices->SetNormal(pos + 3, LEFT); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(a.x, b.y, b.z)); m_vertices->SetNormal(pos + 4, LEFT); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(a.x, b.y, a.z)); m_vertices->SetNormal(pos + 5, LEFT); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } if (HasFace(SIDE_RIGHT)) { pos = m_rightFaceVertexOffset; m_vertices->SetPosition3(pos, Vector3(b.x, a.y, b.z)); m_vertices->SetNormal(pos, RIGHT); m_vertices->SetTexCoord(pos, ScaleTexCoord(Vector2(0.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 1, Vector3(b.x, a.y, a.z)); m_vertices->SetNormal(pos + 1, RIGHT); m_vertices->SetTexCoord(pos + 1, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 2, Vector3(b.x, b.y, b.z)); m_vertices->SetNormal(pos + 2, RIGHT); m_vertices->SetTexCoord(pos + 2, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 3, Vector3(b.x, a.y, a.z)); m_vertices->SetNormal(pos + 3, RIGHT); m_vertices->SetTexCoord(pos + 3, ScaleTexCoord(Vector2(1.0f, 1.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 4, Vector3(b.x, b.y, a.z)); m_vertices->SetNormal(pos + 4, RIGHT); m_vertices->SetTexCoord(pos + 4, ScaleTexCoord(Vector2(1.0f, 0.0f), *textureAtlasTileBoundaries)); m_vertices->SetPosition3(pos + 5, Vector3(b.x, b.y, b.z)); m_vertices->SetNormal(pos + 5, RIGHT); m_vertices->SetTexCoord(pos + 5, ScaleTexCoord(Vector2(0.0f, 0.0f), *textureAtlasTileBoundaries)); } }
CubeTileMesh::CubeTileMesh(CUBE_FACES faces, const RectF *textureAtlasTileBoundaries, MESH_SIDES opaqueSides, TILE_LIGHT_VALUE lightValue, bool alpha, float translucency, const Color &color) { m_faces = faces; SetOpaque(opaqueSides); SetAlpha(alpha); SetColor(color); SetTranslucency(translucency); SetLight(lightValue); m_topFaceVertexOffset = 0; m_bottomFaceVertexOffset = 0; m_frontFaceVertexOffset = 0; m_backFaceVertexOffset = 0; m_leftFaceVertexOffset = 0; m_rightFaceVertexOffset = 0; uint numVertices = 0; if (HasFace(SIDE_TOP)) { m_topFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } if (HasFace(SIDE_BOTTOM)) { m_bottomFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } if (HasFace(SIDE_FRONT)) { m_frontFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } if (HasFace(SIDE_BACK)) { m_backFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } if (HasFace(SIDE_LEFT)) { m_leftFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } if (HasFace(SIDE_RIGHT)) { m_rightFaceVertexOffset = numVertices; numVertices += CUBE_VERTICES_PER_FACE; } VERTEX_ATTRIBS attribs[] = { VERTEX_POS_3D, VERTEX_NORMAL, VERTEX_COLOR, VERTEX_TEXCOORD }; m_vertices = new VertexBuffer(); ASSERT(m_vertices != NULL); m_vertices->Initialize(attribs, 4, numVertices, BUFFEROBJECT_USAGE_STATIC); SetupFaceVertices(textureAtlasTileBoundaries); SetupCollisionVertices(); }