-
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/graphics settings #2534
Feat/graphics settings #2534
Changes from all commits
d074fe8
58e873b
dda2d97
9a81e2b
683ea01
fc2eba4
fd49384
5ef1746
03f7d72
73b4f26
7f187f5
a5fb7eb
2b80d68
e74979d
aa27c14
65dad8b
1b98686
e096993
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 | ||
---|---|---|---|---|
@@ -1,3 +1,4 @@ | ||||
import { GRAPHICS_SETTING, GraphicsSettings } from "@/ui/config"; | ||||
import { ResourcesIds, StructureType } from "@bibliothecadao/eternum"; | ||||
import * as THREE from "three"; | ||||
import { AnimationClip, AnimationMixer } from "three"; | ||||
|
@@ -73,7 +74,7 @@ export default class InstancedModel { | |||
tmp.userData.isInstanceModel = true; | ||||
|
||||
if (!enableRaycast) { | ||||
tmp.raycast = () => {}; | ||||
tmp.raycast = () => { }; | ||||
} | ||||
|
||||
this.mixer = new AnimationMixer(gltf.scene); | ||||
|
@@ -168,6 +169,10 @@ export default class InstancedModel { | |||
} | ||||
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. Remove console.log statement in removeInstance method
Suggested change
|
||||
|
||||
updateAnimations(deltaTime: number) { | ||||
if (GRAPHICS_SETTING === GraphicsSettings.LOW) { | ||||
return; | ||||
} | ||||
|
||||
if (this.mixer && this.animation) { | ||||
const time = performance.now() * 0.001; | ||||
this.instancedMeshes.forEach((mesh, meshIndex) => { | ||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -3,29 +3,47 @@ import { BuildingType, FELT_CENTER } from "@bibliothecadao/eternum"; | |||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
export { FELT_CENTER }; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
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. Consider adding JSDoc comments to document what features/performance characteristics each graphics setting level provides
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
const checkIfGameIsRunningOnLaptop = async () => { | ||||||||||||||||||||||||||||||||||||||||||
export enum GraphicsSettings { | ||||||||||||||||||||||||||||||||||||||||||
LOW = "LOW", | ||||||||||||||||||||||||||||||||||||||||||
MID = "MID", | ||||||||||||||||||||||||||||||||||||||||||
HIGH = "HIGH" | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const checkGraphicsSettings = async () => { | ||||||||||||||||||||||||||||||||||||||||||
// Handle migration from old LOW_GRAPHICS_FLAG | ||||||||||||||||||||||||||||||||||||||||||
const oldLowGraphicsFlag = localStorage.getItem("LOW_GRAPHICS_FLAG"); | ||||||||||||||||||||||||||||||||||||||||||
if (oldLowGraphicsFlag !== null) { | ||||||||||||||||||||||||||||||||||||||||||
// Migrate old setting to new format | ||||||||||||||||||||||||||||||||||||||||||
const newSetting = oldLowGraphicsFlag === "true" ? GraphicsSettings.LOW : GraphicsSettings.HIGH; | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("GRAPHICS_SETTING", newSetting); | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+18
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. Consider using TypeScript const assertions for the localStorage keys to prevent typos and improve type safety
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
localStorage.removeItem("LOW_GRAPHICS_FLAG"); // Clean up old setting | ||||||||||||||||||||||||||||||||||||||||||
return newSetting; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// Check if initial laptop check has been done | ||||||||||||||||||||||||||||||||||||||||||
if (!localStorage.getItem("INITIAL_LAPTOP_CHECK")) { | ||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||
const battery = await (navigator as any).getBattery(); | ||||||||||||||||||||||||||||||||||||||||||
if (battery.charging && battery.chargingTime === 0) { | ||||||||||||||||||||||||||||||||||||||||||
// It's likely a desktop | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("LOW_GRAPHICS_FLAG", "false"); | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("GRAPHICS_SETTING", GraphicsSettings.HIGH); | ||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||
// It's likely a laptop or mobile device. | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("LOW_GRAPHICS_FLAG", "true"); | ||||||||||||||||||||||||||||||||||||||||||
// It's likely a laptop or mobile device | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("GRAPHICS_SETTING", GraphicsSettings.LOW); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||
console.error("Error calling getBattery():", error); | ||||||||||||||||||||||||||||||||||||||||||
// Set default values if getBattery() is not supported | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("LOW_GRAPHICS_FLAG", "true"); | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("GRAPHICS_SETTING", GraphicsSettings.LOW); | ||||||||||||||||||||||||||||||||||||||||||
} finally { | ||||||||||||||||||||||||||||||||||||||||||
localStorage.setItem("INITIAL_LAPTOP_CHECK", "true"); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
return localStorage.getItem("LOW_GRAPHICS_FLAG") === "true"; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return localStorage.getItem("GRAPHICS_SETTING") as GraphicsSettings || GraphicsSettings.HIGH; | ||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
export const IS_LOW_GRAPHICS_ENABLED = await checkIfGameIsRunningOnLaptop(); | ||||||||||||||||||||||||||||||||||||||||||
export const GRAPHICS_SETTING = await checkGraphicsSettings(); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
export const IS_MOBILE = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
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.
Consider extracting the frame rate limiting logic into a reusable utility function since it's used in multiple places