void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset) { const video::SColor color(255, 255, 255, 255); const video::SColor colors[] = {color, color, color, color}; video::ITexture *stat_texture = tsrc->getTexture(texture); if (!stat_texture) return; core::dimension2di srcd(stat_texture->getOriginalSize()); v2s32 p = pos; if (corner & HUD_CORNER_LOWER) p -= srcd.Height; p += offset; v2s32 steppos; switch (drawdir) { case HUD_DIR_RIGHT_LEFT: steppos = v2s32(-1, 0); break; case HUD_DIR_TOP_BOTTOM: steppos = v2s32(0, 1); break; case HUD_DIR_BOTTOM_TOP: steppos = v2s32(0, -1); break; default: steppos = v2s32(1, 0); } steppos.X *= srcd.Width; steppos.Y *= srcd.Height; for (s32 i = 0; i < count / 2; i++) { core::rect<s32> srcrect(0, 0, srcd.Width, srcd.Height); core::rect<s32> dstrect(srcrect); dstrect += p; driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); p += steppos; } if (count % 2 == 1) { core::rect<s32> srcrect(0, 0, srcd.Width / 2, srcd.Height); core::rect<s32> dstrect(srcrect); dstrect += p; driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); } }
//============================================================================== Error Material::parseMaterialTag(const XmlElement& materialEl, ResourceInitializer& rinit) { Error err = ErrorCode::NONE; XmlElement el; // levelsOfDetail // XmlElement lodEl; ANKI_CHECK(materialEl.getChildElementOptional("levelsOfDetail", lodEl)); if(lodEl) { I64 tmp; ANKI_CHECK(lodEl.getI64(tmp)); m_lodsCount = (tmp < 1) ? 1 : tmp; } else { m_lodsCount = 1; } // shadow // XmlElement shadowEl; ANKI_CHECK(materialEl.getChildElementOptional("shadow", shadowEl)); if(shadowEl) { I64 tmp; ANKI_CHECK(shadowEl.getI64(tmp)); m_shadow = tmp; } // blendFunctions // XmlElement blendFunctionsEl; ANKI_CHECK( materialEl.getChildElementOptional("blendFunctions", blendFunctionsEl)); if(blendFunctionsEl) { CString cstr; // sFactor ANKI_CHECK(blendFunctionsEl.getChildElement("sFactor", el)); ANKI_CHECK(el.getText(cstr)); m_blendingSfactor = blendToEnum(cstr); if(m_blendingSfactor == 0) { return ErrorCode::USER_DATA; } // dFactor ANKI_CHECK(blendFunctionsEl.getChildElement("dFactor", el)); ANKI_CHECK(el.getText(cstr)); m_blendingDfactor = blendToEnum(cstr); if(m_blendingDfactor == 0) { return ErrorCode::USER_DATA; } } else { m_passesCount = 2; } // depthTesting // XmlElement depthTestingEl; ANKI_CHECK( materialEl.getChildElementOptional("depthTesting", depthTestingEl)); if(depthTestingEl) { I64 tmp; ANKI_CHECK(depthTestingEl.getI64(tmp)); m_depthTesting = tmp; } // wireframe // XmlElement wireframeEl; ANKI_CHECK(materialEl.getChildElementOptional("wireframe", wireframeEl)); if(wireframeEl) { I64 tmp; ANKI_CHECK(wireframeEl.getI64(tmp)); m_wireframe = tmp; } // shaderProgram // ANKI_CHECK(materialEl.getChildElement("programs", el)); MaterialProgramCreator loader(rinit.m_tempAlloc); ANKI_CHECK(loader.parseProgramsTag(el)); m_tessellation = loader.hasTessellation(); U tessCount = m_tessellation ? 2 : 1; // Alloc program vector ANKI_CHECK(m_progs.create(rinit.m_alloc, countShaders(ShaderType::VERTEX) + countShaders(ShaderType::TESSELLATION_CONTROL) + countShaders(ShaderType::TESSELLATION_EVALUATION) + countShaders(ShaderType::GEOMETRY) + countShaders(ShaderType::FRAGMENT))); // Aloc progam descriptors m_pplines.resize(m_passesCount * m_lodsCount * tessCount); m_hash = 0; for(ShaderType shader = ShaderType::VERTEX; shader <= ShaderType::FRAGMENT; ++shader) { Bool isTessellationShader = shader == ShaderType::TESSELLATION_CONTROL || shader == ShaderType::TESSELLATION_EVALUATION; if(!m_tessellation && isTessellationShader) { // Skip tessellation if not enabled continue; } if(shader == ShaderType::GEOMETRY) { // Skip geometry for now continue; } for(U level = 0; level < m_lodsCount; ++level) { if(level > 0 && isTessellationShader) { continue; } for(U pid = 0; pid < m_passesCount; ++pid) { for(U tess = 0; tess < tessCount; ++tess) { if(tess == 0 && isTessellationShader) { continue; } if(tess > 0 && shader == ShaderType::FRAGMENT) { continue; } TempResourceString src; TempResourceString::ScopeDestroyer srcd( &src, rinit.m_tempAlloc); ANKI_CHECK(src.sprintf( rinit.m_tempAlloc, "%s\n" "#define LOD %u\n" "#define PASS %u\n" "#define TESSELLATION %u\n" "%s\n", &rinit.m_resources._getShadersPrependedSource()[0], level, pid, tess, &loader.getProgramSource(shader)[0])); TempResourceString filename; TempResourceString::ScopeDestroyer filenamed( &filename, rinit.m_tempAlloc); ANKI_CHECK(createProgramSourceToCache(src, filename)); RenderingKey key((Pass)pid, level, tess); ProgramResourcePointer& progr = getProgram(key, shader); ANKI_CHECK( progr.load(filename.toCString(), &rinit.m_resources)); // Update the hash m_hash ^= computeHash(&src[0], src.getLength()); } } } } ANKI_CHECK(populateVariables(loader)); // Get uniform block size ANKI_ASSERT(m_progs.getSize() > 0); m_shaderBlockSize = loader.getUniformBlockSize(); return err; }
void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset, v2s32 size) { const video::SColor color(255, 255, 255, 255); const video::SColor colors[] = {color, color, color, color}; video::ITexture *stat_texture = tsrc->getTexture(texture); if (!stat_texture) return; core::dimension2di srcd(stat_texture->getOriginalSize()); core::dimension2di dstd; if (size == v2s32()) { dstd = srcd; } else { double size_factor = g_settings->getFloat("hud_scaling") * porting::getDisplayDensity(); dstd.Height = size.Y * size_factor; dstd.Width = size.X * size_factor; offset.X *= size_factor; offset.Y *= size_factor; } v2s32 p = pos; if (corner & HUD_CORNER_LOWER) p -= dstd.Height; p += offset; v2s32 steppos; switch (drawdir) { case HUD_DIR_RIGHT_LEFT: steppos = v2s32(-1, 0); break; case HUD_DIR_TOP_BOTTOM: steppos = v2s32(0, 1); break; case HUD_DIR_BOTTOM_TOP: steppos = v2s32(0, -1); break; default: steppos = v2s32(1, 0); } steppos.X *= dstd.Width; steppos.Y *= dstd.Height; for (s32 i = 0; i < count / 2; i++) { core::rect<s32> srcrect(0, 0, srcd.Width, srcd.Height); core::rect<s32> dstrect(0,0, dstd.Width, dstd.Height); dstrect += p; driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); p += steppos; } if (count % 2 == 1) { core::rect<s32> srcrect(0, 0, srcd.Width / 2, srcd.Height); core::rect<s32> dstrect(0,0, dstd.Width / 2, dstd.Height); dstrect += p; driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); } }