-
Notifications
You must be signed in to change notification settings - Fork 49
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: flat mode view and optimized chunks loading #2572
base: next
Are you sure you want to change the base?
Changes from 5 commits
de8660b
9db4d4e
b0a9e30
dba2548
61a9e43
2e2d05a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -6,7 +6,7 @@ import { LoadingStateKey } from "@/hooks/store/useWorldLoading"; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { soundSelector } from "@/hooks/useUISound"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { HexPosition, SceneName } from "@/types"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Position } from "@/types/Position"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { FELT_CENTER, IS_MOBILE } from "@/ui/config"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { FELT_CENTER, IS_FLAT_MODE, IS_MOBILE } from "@/ui/config"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { UNDEFINED_STRUCTURE_ENTITY_ID } from "@/ui/constants"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { LeftView } from "@/ui/modules/navigation/LeftNavigationModule"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getWorldPositionForHex } from "@/ui/utils/utils"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -369,7 +369,7 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setup() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.controls.maxDistance = 20; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.controls.maxDistance = IS_FLAT_MODE ? 40 : 20; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.controls.enablePan = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.controls.zoomToCursor = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.moveCameraToURLLocation(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -428,10 +428,15 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.scale.set(HEX_SIZE, HEX_SIZE, HEX_SIZE); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationSeed = this.hashCoordinates(col, row); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationIndex = Math.floor(rotationSeed * 6); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const randomRotation = (rotationIndex * Math.PI) / 3; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = randomRotation; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!IS_FLAT_MODE) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationSeed = this.hashCoordinates(col, row); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationIndex = Math.floor(rotationSeed * 6); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const randomRotation = (rotationIndex * Math.PI) / 3; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = randomRotation; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.position.y += 0.1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const biomePosition = new Position({ x: col, y: row }).getContract(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const biome = this.biome.getBiome(biomePosition.x, biomePosition.y); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -483,6 +488,23 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.removeCachedMatricesAroundColRow(renderedChunkCenterCol, renderedChunkCenterRow); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getChunksAround(chunkKey: string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startRow = parseInt(chunkKey.split(",")[0]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startCol = parseInt(chunkKey.split(",")[1]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const chunks: string[] = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let i = -this.renderChunkSize.width / 2; i <= this.renderChunkSize.width / 2; i += this.chunkSize) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let j = -this.renderChunkSize.width / 2; j <= this.renderChunkSize.height / 2; j += this.chunkSize) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x, y, z } = getWorldPositionForHex({ row: startRow + i, col: startCol + j }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { chunkX, chunkZ } = this.worldToChunkCoordinates(x, z); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const _chunkKey = `${chunkZ * this.chunkSize},${chunkX * this.chunkSize}`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!chunks.includes(_chunkKey)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chunks.push(_chunkKey); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return chunks; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+491
to
+506
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix incorrect dimension in chunk calculation loop There's a bug in the inner loop condition where it uses width instead of height, which could lead to incorrect chunk calculations. Apply this fix: - for (let j = -this.renderChunkSize.width / 2; j <= this.renderChunkSize.height / 2; j += this.chunkSize) {
+ for (let j = -this.renderChunkSize.height / 2; j <= this.renderChunkSize.height / 2; j += this.chunkSize) { 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeCachedMatricesAroundColRow(col: number, row: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let i = -this.renderChunkSize.width / 2; i <= this.renderChunkSize.width / 2; i += 10) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let j = -this.renderChunkSize.width / 2; j <= this.renderChunkSize.height / 2; j += 10) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -547,6 +569,7 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async updateHexagonGrid(startRow: number, startCol: number, rows: number, cols: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await Promise.all(this.modelLoadPromises); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.applyCachedMatricesForChunk(startRow, startCol)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("cache applied"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.computeInteractiveHexes(startRow, startCol, rows, cols); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -578,6 +601,12 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let currentIndex = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let hashedTiles: string[] = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.computeTileEntities(this.currentChunk); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this.getChunksAround(this.currentChunk).forEach((chunkKey) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// console.log("chunkKey", chunkKey); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this.computeTileEntities(chunkKey); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const processBatch = async () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const endIndex = Math.min(currentIndex + batchSize, rows * cols); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -620,7 +649,12 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationSeed = this.hashCoordinates(startCol + col, startRow + row); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rotationIndex = Math.floor(rotationSeed * 6); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const randomRotation = (rotationIndex * Math.PI) / 3; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = randomRotation; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!IS_FLAT_MODE) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = randomRotation; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.position.y += 0.1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dummy.rotation.y = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const biome = this.biome.getBiome(startCol + col + FELT_CENTER, startRow + row + FELT_CENTER); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -648,8 +682,6 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.cacheMatricesForChunk(startRow, startCol); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.interactiveHexManager.renderHexes(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await this.computeTileEntities(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -658,26 +690,15 @@ export default class WorldmapScene extends HexagonScene { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async computeTileEntities() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const cameraPosition = new THREE.Vector3(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cameraPosition.copy(this.controls.target); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async computeTileEntities(chunkKey: string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startCol = parseInt(chunkKey.split(",")[1]) + FELT_CENTER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startRow = parseInt(chunkKey.split(",")[0]) + FELT_CENTER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const adjustedX = cameraPosition.x + (this.chunkSize * HEX_SIZE * Math.sqrt(3)) / 2; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const adjustedZ = cameraPosition.z + (this.chunkSize * HEX_SIZE * 1.5) / 3; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Parse current chunk coordinates | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { chunkX, chunkZ } = this.worldToChunkCoordinates(adjustedX, adjustedZ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startCol = chunkX * this.chunkSize + FELT_CENTER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const startRow = chunkZ * this.chunkSize + FELT_CENTER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//const range = this.chunkSize / 2; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+693
to
+697
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Clean up debug code and optimize range calculation
Apply these changes: - //const range = this.chunkSize / 2;
-
- const { width } = this.renderChunkSize;
- const range = width / 2;
-
- // Skip if we've already fetched this chunk
- if (this.fetchedChunks.has(chunkKey)) {
- console.log("Already fetched");
- return;
- }
-
- // Add to fetched chunks before the query to prevent concurrent duplicate requests
- this.fetchedChunks.add(chunkKey);
- console.log(startCol, startRow, range);
+ const range = this.chunkSize / 2;
+
+ if (this.fetchedChunks.has(chunkKey)) {
+ return;
+ }
+
+ this.fetchedChunks.add(chunkKey);
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { width } = this.renderChunkSize; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const range = width / 2; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Create a unique key for this chunk range | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const chunkKey = `${startCol - range},${startCol + range},${startRow - range},${startRow + range}`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log({ chunkKey }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Skip if we've already fetched this chunk | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.fetchedChunks.has(chunkKey)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("Already fetched"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Refactor duplicate camera movement logic.
The camera position calculation logic is duplicated between
moveCameraToXYZ
andmoveCameraToColRow
.Extract the common logic into a shared method:
Also applies to: 347-357