Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/rendering/StarTilePainter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/rendering/StarTilePainter.cpp')
-rw-r--r--source/rendering/StarTilePainter.cpp181
1 files changed, 5 insertions, 176 deletions
diff --git a/source/rendering/StarTilePainter.cpp b/source/rendering/StarTilePainter.cpp
index 40b3de6..de49910 100644
--- a/source/rendering/StarTilePainter.cpp
+++ b/source/rendering/StarTilePainter.cpp
@@ -6,10 +6,11 @@
#include "StarLiquidsDatabase.hpp"
#include "StarAssets.hpp"
#include "StarRoot.hpp"
+#include "StarTileDrawer.hpp"
namespace Star {
-TilePainter::TilePainter(RendererPtr renderer) {
+TilePainter::TilePainter(RendererPtr renderer) : TileDrawer() {
m_renderer = move(renderer);
m_textureGroup = m_renderer->createTextureGroup(TextureGroupSize::Large);
@@ -24,10 +25,6 @@ TilePainter::TilePainter(RendererPtr renderer) {
m_textureCache.setTimeToLive(assets->json("/rendering.config:textureTimeout").toInt());
- m_backgroundLayerColor = jsonToColor(assets->json("/rendering.config:backgroundLayerColor")).toRgba();
- m_foregroundLayerColor = jsonToColor(assets->json("/rendering.config:foregroundLayerColor")).toRgba();
- m_liquidDrawLevels = jsonToVec2F(assets->json("/rendering.config:liquidDrawLevels"));
-
for (auto const& liquid : root.liquidsDatabase()->allLiquidSettings()) {
m_liquids.set(liquid->id, LiquidInfo{
m_renderer->createTexture(*assets->image(liquid->config.getString("texture")), TextureAddressing::Wrap),
@@ -152,57 +149,6 @@ TilePainter::ChunkHash TilePainter::liquidChunkHash(WorldRenderData& renderData,
return XXH3_64bits(buffer.ptr(), buffer.size());
}
-TilePainter::QuadZLevel TilePainter::materialZLevel(uint32_t zLevel, MaterialId material, MaterialHue hue, MaterialColorVariant colorVariant) {
- QuadZLevel quadZLevel = 0;
- quadZLevel |= (uint64_t)colorVariant;
- quadZLevel |= (uint64_t)hue << 8;
- quadZLevel |= (uint64_t)material << 16;
- quadZLevel |= (uint64_t)zLevel << 32;
- return quadZLevel;
-}
-
-TilePainter::QuadZLevel TilePainter::modZLevel(uint32_t zLevel, ModId mod, MaterialHue hue, MaterialColorVariant colorVariant) {
- QuadZLevel quadZLevel = 0;
- quadZLevel |= (uint64_t)colorVariant;
- quadZLevel |= (uint64_t)hue << 8;
- quadZLevel |= (uint64_t)mod << 16;
- quadZLevel |= (uint64_t)zLevel << 32;
- quadZLevel |= (uint64_t)1 << 63;
- return quadZLevel;
-}
-
-TilePainter::QuadZLevel TilePainter::damageZLevel() {
- return (uint64_t)(-1);
-}
-
-RenderTile const& TilePainter::getRenderTile(WorldRenderData const& renderData, Vec2I const& worldPos) {
- Vec2I arrayPos = renderData.geometry.diff(worldPos, renderData.tileMinPosition);
-
- Vec2I size = Vec2I(renderData.tiles.size());
- if (arrayPos[0] >= 0 && arrayPos[1] >= 0 && arrayPos[0] < size[0] && arrayPos[1] < size[1])
- return renderData.tiles(Vec2S(arrayPos));
-
- static RenderTile defaultRenderTile = {
- NullMaterialId,
- NoModId,
- NullMaterialId,
- NoModId,
- 0,
- 0,
- DefaultMaterialColorVariant,
- TileDamageType::Protected,
- 0,
- 0,
- 0,
- DefaultMaterialColorVariant,
- TileDamageType::Protected,
- 0,
- EmptyLiquidId,
- 0
- };
- return defaultRenderTile;
-}
-
void TilePainter::renderTerrainChunks(WorldCamera const& camera, TerrainLayer terrainLayer) {
Map<QuadZLevel, List<RenderBufferPtr>> zOrderBuffers;
for (auto const& chunk : m_pendingTerrainChunks) {
@@ -285,7 +231,7 @@ bool TilePainter::produceTerrainPrimitives(HashMap<QuadZLevel, List<RenderPrimit
MaterialId material = EmptyMaterialId;
MaterialHue materialHue = 0;
- MaterialHue materialColorVariant = 0;
+ MaterialColorVariant materialColorVariant = 0;
ModId mod = NoModId;
MaterialHue modHue = 0;
float damageLevel = 0.0f;
@@ -316,7 +262,7 @@ bool TilePainter::produceTerrainPrimitives(HashMap<QuadZLevel, List<RenderPrimit
// render non-block colliding things in the midground
bool isBlock = BlockCollisionSet.contains(materialDatabase->materialCollisionKind(material));
- if ((isBlock && terrainLayer == TerrainLayer::Midground) || (!isBlock && terrainLayer == TerrainLayer::Foreground))
+ if (terrainLayer == (isBlock ? TerrainLayer::Midground : TerrainLayer::Foreground))
return false;
auto getPieceTexture = [this, assets](MaterialId material, MaterialRenderPieceConstPtr const& piece, MaterialHue hue, bool mod) {
@@ -423,7 +369,7 @@ void TilePainter::produceLiquidPrimitives(HashMap<LiquidId, List<RenderPrimitive
auto texRect = worldRect.scaled(TilePixels);
auto const& liquid = m_liquids[tile.liquidId];
- primitives[tile.liquidId].emplace_back(std::in_place_type_t<RenderQuad>(), move(liquid.texture),
+ primitives[tile.liquidId].emplace_back(std::in_place_type_t<RenderQuad>(), liquid.texture,
worldRect.min(), texRect.min(),
Vec2F(worldRect.xMax(), worldRect.yMin()), Vec2F(texRect.xMax(), texRect.yMin()),
worldRect.max(), texRect.max(),
@@ -431,123 +377,6 @@ void TilePainter::produceLiquidPrimitives(HashMap<LiquidId, List<RenderPrimitive
liquid.color, 1.0f);
}
-bool TilePainter::determineMatchingPieces(MaterialPieceResultList& resultList, bool* occlude, MaterialDatabaseConstPtr const& materialDb, MaterialRenderMatchList const& matchList,
- WorldRenderData const& renderData, Vec2I const& basePos, TileLayer layer, bool isMod) {
- RenderTile const& tile = getRenderTile(renderData, basePos);
-
- auto matchSetMatches = [&](MaterialRenderMatchConstPtr const& match) -> bool {
- if (match->requiredLayer && *match->requiredLayer != layer)
- return false;
-
- if (match->matchPoints.empty())
- return true;
-
- bool matchValid = match->matchJoin == MaterialJoinType::All;
- for (auto const& matchPoint : match->matchPoints) {
- auto const& neighborTile = getRenderTile(renderData, basePos + matchPoint.position);
-
- bool neighborShadowing = false;
- if (layer == TileLayer::Background) {
- if (auto profile = materialDb->materialRenderProfile(neighborTile.foreground))
- neighborShadowing = !profile->foregroundLightTransparent;
- }
-
- MaterialHue baseHue = layer == TileLayer::Foreground ? tile.foregroundHueShift : tile.backgroundHueShift;
- MaterialHue neighborHue = layer == TileLayer::Foreground ? neighborTile.foregroundHueShift : neighborTile.backgroundHueShift;
- MaterialHue baseModHue = layer == TileLayer::Foreground ? tile.foregroundModHueShift : tile.backgroundModHueShift;
- MaterialHue neighborModHue = layer == TileLayer::Foreground ? neighborTile.foregroundModHueShift : neighborTile.backgroundModHueShift;
- MaterialId baseMaterial = layer == TileLayer::Foreground ? tile.foreground : tile.background;
- MaterialId neighborMaterial = layer == TileLayer::Foreground ? neighborTile.foreground : neighborTile.background;
- ModId baseMod = layer == TileLayer::Foreground ? tile.foregroundMod : tile.backgroundMod;
- ModId neighborMod = layer == TileLayer::Foreground ? neighborTile.foregroundMod : neighborTile.backgroundMod;
-
- bool rulesValid = matchPoint.rule->join == MaterialJoinType::All;
- for (auto const& ruleEntry : matchPoint.rule->entries) {
- bool valid = true;
- if (isMod) {
- if (ruleEntry.rule.is<MaterialRule::RuleEmpty>()) {
- valid = neighborMod == NoModId;
- } else if (ruleEntry.rule.is<MaterialRule::RuleConnects>()) {
- valid = isConnectableMaterial(neighborMaterial);
- } else if (ruleEntry.rule.is<MaterialRule::RuleShadows>()) {
- valid = neighborShadowing;
- } else if (auto equalsSelf = ruleEntry.rule.ptr<MaterialRule::RuleEqualsSelf>()) {
- valid = neighborMod == baseMod;
- if (equalsSelf->matchHue)
- valid = valid && baseModHue == neighborModHue;
- } else if (auto equalsId = ruleEntry.rule.ptr<MaterialRule::RuleEqualsId>()) {
- valid = neighborMod == equalsId->id;
- } else if (auto propertyEquals = ruleEntry.rule.ptr<MaterialRule::RulePropertyEquals>()) {
- if (auto profile = materialDb->modRenderProfile(neighborMod))
- valid = profile->ruleProperties.get(propertyEquals->propertyName, Json()) == propertyEquals->compare;
- else
- valid = false;
- }
- } else {
- if (ruleEntry.rule.is<MaterialRule::RuleEmpty>()) {
- valid = neighborMaterial == EmptyMaterialId;
- } else if (ruleEntry.rule.is<MaterialRule::RuleConnects>()) {
- valid = isConnectableMaterial(neighborMaterial);
- } else if (ruleEntry.rule.is<MaterialRule::RuleShadows>()) {
- valid = neighborShadowing;
- } else if (auto equalsSelf = ruleEntry.rule.ptr<MaterialRule::RuleEqualsSelf>()) {
- valid = neighborMaterial == baseMaterial;
- if (equalsSelf->matchHue)
- valid = valid && baseHue == neighborHue;
- } else if (auto equalsId = ruleEntry.rule.ptr<MaterialRule::RuleEqualsId>()) {
- valid = neighborMaterial == equalsId->id;
- } else if (auto propertyEquals = ruleEntry.rule.ptr<MaterialRule::RulePropertyEquals>()) {
- if (auto profile = materialDb->materialRenderProfile(neighborMaterial))
- valid = profile->ruleProperties.get(propertyEquals->propertyName) == propertyEquals->compare;
- else
- valid = false;
- }
- }
- if (ruleEntry.inverse)
- valid = !valid;
-
- if (matchPoint.rule->join == MaterialJoinType::All) {
- rulesValid = valid && rulesValid;
- if (!rulesValid)
- break;
- } else {
- rulesValid = valid || rulesValid;
- }
- }
-
- if (match->matchJoin == MaterialJoinType::All) {
- matchValid = matchValid && rulesValid;
- if (!matchValid)
- return matchValid;
- } else {
- matchValid = matchValid || rulesValid;
- }
- }
- return matchValid;
- };
-
- bool subMatchResult = false;
- for (auto const& match : matchList) {
- if (matchSetMatches(match)) {
- if (match->occlude)
- *occlude = match->occlude.get();
-
- subMatchResult = true;
-
- for (auto const& piecePair : match->resultingPieces)
- resultList.append({piecePair.first, piecePair.second});
-
- if (determineMatchingPieces(resultList, occlude, materialDb, match->subMatches, renderData, basePos, layer, isMod) && match->haltOnSubMatch)
- break;
-
- if (match->haltOnMatch)
- break;
- }
- }
-
- return subMatchResult;
-}
-
float TilePainter::liquidDrawLevel(float liquidLevel) const {
return clamp((liquidLevel - m_liquidDrawLevels[0]) / (m_liquidDrawLevels[1] - m_liquidDrawLevels[0]), 0.0f, 1.0f);
}