Working on game states
This commit is contained in:
1 parent
0ca00f965d
commit
e0968b5522
10 files changed
+340
-251
No files matched your search
@@ -118,10 +118,45 @@ namespace ZL {
|
||||
return objects;
|
||||
}
|
||||
|
||||
LoadedGameObjectState GameObjectData::toLoadedGameObjectState() const {
|
||||
LoadedGameObjectState st;
|
||||
st.texturePath = texturePath;
|
||||
st.textureDarkandsPath = textureDarkandsPath;
|
||||
st.meshPath = meshPath;
|
||||
st.meshRotationX = rotationX;
|
||||
st.meshRotationY = rotationY;
|
||||
st.meshRotationZ = rotationZ;
|
||||
st.meshScale = scale;
|
||||
return st;
|
||||
}
|
||||
|
||||
InteractiveObjectState InteractiveObjectData::toInteractiveObjectState() const {
|
||||
InteractiveObjectState st;
|
||||
st.objectInfo = base.toLoadedGameObjectState();
|
||||
st.interactionRadius = interactionRadius;
|
||||
st.approachRadius = approachRadius;
|
||||
st.castShadow = castShadow;
|
||||
st.castShadowNight = castShadowNight;
|
||||
st.isActive = isActive;
|
||||
st.activateFunctionName = activateFunctionName;
|
||||
st.pivot = Eigen::Vector3f(pivotX, pivotY, pivotZ);
|
||||
st.boundsMin = Eigen::Vector3f(boundsMinX, boundsMinY, boundsMinZ);
|
||||
st.boundsMax = Eigen::Vector3f(boundsMaxX, boundsMaxY, boundsMaxZ);
|
||||
st.hasInteractionPosition = hasInteractionPosition;
|
||||
if (hasInteractionPosition)
|
||||
st.interactionPosition = Eigen::Vector3f(interactionPositionX, interactionPositionY, interactionPositionZ);
|
||||
st.jsonPositionX = base.positionX;
|
||||
st.jsonPositionY = base.positionY;
|
||||
st.jsonPositionZ = base.positionZ;
|
||||
// state.position is set by InteractiveObject::createFromState() after mesh-center computation
|
||||
return st;
|
||||
}
|
||||
|
||||
LoadedGameObject GameObjectLoader::buildLoadedObject(const GameObjectData& data, Renderer& renderer, const std::string& zipPath)
|
||||
{
|
||||
LoadedGameObject obj;
|
||||
obj.name = data.name;
|
||||
obj.creationInfo = data.toLoadedGameObjectState();
|
||||
|
||||
obj.texture = renderer.textureManager.LoadFromPng(data.texturePath, zipPath);
|
||||
if (!data.textureDarkandsPath.empty())
|
||||
@@ -192,54 +227,9 @@ namespace ZL {
|
||||
for (const auto& data : loadInteractiveFromJson(jsonPath, zipPath)) {
|
||||
std::cout << "Loading interactive object: " << data.base.name << std::endl;
|
||||
try {
|
||||
InteractiveObject intObj;
|
||||
intObj.loadedObject = buildLoadedObject(data.base, renderer, zipPath);
|
||||
intObj.interactionRadius = data.interactionRadius;
|
||||
intObj.approachRadius = data.approachRadius;
|
||||
intObj.castShadow = data.castShadow;
|
||||
intObj.castShadowNight = data.castShadowNight;
|
||||
intObj.isActive = data.isActive;
|
||||
intObj.activateFunctionName = data.activateFunctionName;
|
||||
intObj.pivot = Eigen::Vector3f(data.pivotX, data.pivotY, data.pivotZ);
|
||||
intObj.boundsMin = Eigen::Vector3f(data.boundsMinX, data.boundsMinY, data.boundsMinZ);
|
||||
intObj.boundsMax = Eigen::Vector3f(data.boundsMaxX, data.boundsMaxY, data.boundsMaxZ);
|
||||
intObj.hasInteractionPosition = data.hasInteractionPosition;
|
||||
if (data.hasInteractionPosition)
|
||||
intObj.interactionPosition = Eigen::Vector3f(data.interactionPositionX, data.interactionPositionY, data.interactionPositionZ);
|
||||
|
||||
// Store source data needed for serialization.
|
||||
intObj.loadedObject.texturePath = data.base.texturePath;
|
||||
intObj.loadedObject.textureDarkandsPath = data.base.textureDarkandsPath;
|
||||
intObj.loadedObject.meshPath = data.base.meshPath;
|
||||
intObj.loadedObject.meshRotationX = data.base.rotationX;
|
||||
intObj.loadedObject.meshRotationY = data.base.rotationY;
|
||||
intObj.loadedObject.meshRotationZ = data.base.rotationZ;
|
||||
intObj.loadedObject.meshScale = data.base.scale;
|
||||
intObj.jsonPositionX = data.base.positionX;
|
||||
intObj.jsonPositionY = data.base.positionY;
|
||||
intObj.jsonPositionZ = data.base.positionZ;
|
||||
|
||||
intObj.loadedObject.mesh.RefreshVBO();
|
||||
|
||||
// Center mesh at origin; store corrected world position separately.
|
||||
if (!intObj.loadedObject.mesh.data.PositionData.empty()) {
|
||||
Eigen::Vector3f meshMin = intObj.loadedObject.mesh.data.PositionData[0];
|
||||
Eigen::Vector3f meshMax = intObj.loadedObject.mesh.data.PositionData[0];
|
||||
for (const auto& v : intObj.loadedObject.mesh.data.PositionData) {
|
||||
meshMin = meshMin.cwiseMin(v);
|
||||
meshMax = meshMax.cwiseMax(v);
|
||||
}
|
||||
Eigen::Vector3f meshCenter = (meshMin + meshMax) * 0.5f;
|
||||
|
||||
intObj.loadedObject.mesh.data.Move(-meshCenter);
|
||||
intObj.loadedObject.mesh.RefreshVBO();
|
||||
|
||||
intObj.position = Eigen::Vector3f(data.base.positionX, data.base.positionY, data.base.positionZ) + meshCenter;
|
||||
} else {
|
||||
intObj.position = Eigen::Vector3f(data.base.positionX, data.base.positionY, data.base.positionZ);
|
||||
}
|
||||
|
||||
interactiveObjects.push_back(std::move(intObj));
|
||||
InteractiveObject intObj = InteractiveObject::createFromState(
|
||||
data.toInteractiveObjectState(), renderer, zipPath);
|
||||
intObj.loadedObject.name = data.base.name;
|
||||
|
||||
if (!data.activateFunctionName.empty())
|
||||
std::cout << "Successfully loaded interactive: " << data.base.name
|
||||
@@ -247,6 +237,7 @@ namespace ZL {
|
||||
else
|
||||
std::cout << "Successfully loaded interactive: " << data.base.name << std::endl;
|
||||
|
||||
interactiveObjects.push_back(std::move(intObj));
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "GameObjectLoader: Failed to load interactive '" << data.base.name << "': " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user