mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-19 10:09:43 +00:00
Feature #161 (In Progress) Load REC_PGRD records
Struct sizes seems correct, but floats is broken
This commit is contained in:
parent
12b7c6f1ac
commit
40e07bbd2a
4 changed files with 74 additions and 5 deletions
|
@ -255,6 +255,13 @@ if (APPLE)
|
||||||
"${APP_BUNDLE_DIR}/Contents/Resources/OpenMW.icns" COPYONLY)
|
"${APP_BUNDLE_DIR}/Contents/Resources/OpenMW.icns" COPYONLY)
|
||||||
|
|
||||||
# prepare plugins
|
# prepare plugins
|
||||||
|
if (${CMAKE_BUILD_TYPE} MATCHES "Release" OR
|
||||||
|
${CMAKE_BUILD_TYPE} MATCHES "RelWithDebugInfo")
|
||||||
|
set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_REL})
|
||||||
|
else()
|
||||||
|
set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_DBG})
|
||||||
|
endif()
|
||||||
|
|
||||||
foreach(plugin ${USED_OGRE_PLUGINS})
|
foreach(plugin ${USED_OGRE_PLUGINS})
|
||||||
configure_file("${OGRE_PLUGIN_DIR}/${plugin}.dylib"
|
configure_file("${OGRE_PLUGIN_DIR}/${plugin}.dylib"
|
||||||
"${APP_BUNDLE_DIR}/Contents/Plugins/${plugin}.dylib"
|
"${APP_BUNDLE_DIR}/Contents/Plugins/${plugin}.dylib"
|
||||||
|
|
|
@ -3,10 +3,22 @@
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
|
|
||||||
|
PathGrid::~PathGrid() {
|
||||||
|
if (points != NULL) {
|
||||||
|
delete[] points;
|
||||||
|
points = NULL;
|
||||||
|
}
|
||||||
|
if (edges != NULL) {
|
||||||
|
delete[] edges;
|
||||||
|
edges = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PathGrid::load(ESMReader &esm)
|
void PathGrid::load(ESMReader &esm)
|
||||||
{
|
{
|
||||||
esm.getHNT(data, "DATA", 12);
|
esm.getHNT(data, "DATA", 12);
|
||||||
cell = esm.getHNString("NAME");
|
cell = esm.getHNString("NAME");
|
||||||
|
std::cout << "loading PGRD for " << cell << std::endl;
|
||||||
|
|
||||||
// Remember this file position
|
// Remember this file position
|
||||||
context = esm.getContext();
|
context = esm.getContext();
|
||||||
|
@ -14,10 +26,26 @@ void PathGrid::load(ESMReader &esm)
|
||||||
// Check that the sizes match up. Size = 16 * s2 (path points?)
|
// Check that the sizes match up. Size = 16 * s2 (path points?)
|
||||||
if (esm.isNextSub("PGRP"))
|
if (esm.isNextSub("PGRP"))
|
||||||
{
|
{
|
||||||
esm.skipHSub();
|
esm.getSubHeader();
|
||||||
int size = esm.getSubSize();
|
int size = esm.getSubSize();
|
||||||
|
std::cout << "PGRP size is " << size << std::endl;
|
||||||
if (size != 16 * data.s2)
|
if (size != 16 * data.s2)
|
||||||
esm.fail("Path grid table size mismatch");
|
esm.fail("Path grid table size mismatch");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pointCount = data.s2;
|
||||||
|
std::cout << "Path grid points count for cell `" << data.x
|
||||||
|
<< " " << data.y << "` is " << data.s2 << std::endl;
|
||||||
|
points = new Point[pointCount];
|
||||||
|
esm.getExact(points, size);
|
||||||
|
for (int i = 0; i < pointCount; ++i)
|
||||||
|
{
|
||||||
|
std::cout << i << "'s point: " << points[i].x;
|
||||||
|
std::cout << " " << points[i].y;
|
||||||
|
std::cout << " " << points[i].z;
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size varies. Path grid chances? Connections? Multiples of 4
|
// Size varies. Path grid chances? Connections? Multiples of 4
|
||||||
|
@ -25,10 +53,23 @@ void PathGrid::load(ESMReader &esm)
|
||||||
// it later.
|
// it later.
|
||||||
if (esm.isNextSub("PGRC"))
|
if (esm.isNextSub("PGRC"))
|
||||||
{
|
{
|
||||||
esm.skipHSub();
|
esm.getSubHeader();
|
||||||
int size = esm.getSubSize();
|
int size = esm.getSubSize();
|
||||||
if (size % 4 != 0)
|
if (size % 4 != 0)
|
||||||
esm.fail("PGRC size not a multiple of 4");
|
esm.fail("PGRC size not a multiple of 4");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edgeCount = size / sizeof(Edge);
|
||||||
|
std::cout << "Path grid edge count for cell " << data.x
|
||||||
|
<< " " << data.y << " is " << size << std::endl;
|
||||||
|
edges = new Edge[edgeCount];
|
||||||
|
esm.getExact(edges, size);
|
||||||
|
for (int i = 0; i < edgeCount; ++i)
|
||||||
|
{
|
||||||
|
std::cout << i << "'s edge: " << edges[i].v0 << " "
|
||||||
|
<< edges[i].v1 << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,33 @@ struct PathGrid
|
||||||
short s2; // Number of path points? Size of PGRP block is always 16 * s2;
|
short s2; // Number of path points? Size of PGRP block is always 16 * s2;
|
||||||
}; // 12 bytes
|
}; // 12 bytes
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
struct Point // path grid point
|
||||||
|
{
|
||||||
|
float x, y, z; // Location of point
|
||||||
|
int unknown; // Possibly flag for coloring/user-placed vs auto-generated
|
||||||
|
}; // 16 bytes
|
||||||
|
|
||||||
|
struct Edge // path grid edge
|
||||||
|
{
|
||||||
|
int v0, v1; // index of points connected with this edge
|
||||||
|
}; // 8 bytes
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
std::string cell; // Cell name
|
std::string cell; // Cell name
|
||||||
DATAstruct data;
|
DATAstruct data;
|
||||||
|
|
||||||
|
Point *points;
|
||||||
|
int pointCount;
|
||||||
|
|
||||||
|
Edge *edges;
|
||||||
|
int edgeCount;
|
||||||
|
|
||||||
ESM_Context context; // Context so we can return here later and
|
ESM_Context context; // Context so we can return here later and
|
||||||
// finish the job
|
// finish the job
|
||||||
|
|
||||||
void load(ESMReader &esm);
|
void load(ESMReader &esm);
|
||||||
|
|
||||||
|
~PathGrid();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace ESMS
|
||||||
ScriptListT<Script> scripts;
|
ScriptListT<Script> scripts;
|
||||||
IndexListT<MagicEffect> magicEffects;
|
IndexListT<MagicEffect> magicEffects;
|
||||||
IndexListT<Skill> skills;
|
IndexListT<Skill> skills;
|
||||||
//RecListT<PathGrid> pathgrids;
|
RecListT<PathGrid> pathgrids;
|
||||||
|
|
||||||
// Special entry which is hardcoded and not loaded from an ESM
|
// Special entry which is hardcoded and not loaded from an ESM
|
||||||
IndexListT<Attribute> attributes;
|
IndexListT<Attribute> attributes;
|
||||||
|
@ -124,7 +124,7 @@ namespace ESMS
|
||||||
recLists[REC_MISC] = &miscItems;
|
recLists[REC_MISC] = &miscItems;
|
||||||
recLists[REC_NPC_] = &npcs;
|
recLists[REC_NPC_] = &npcs;
|
||||||
recLists[REC_NPCC] = &npcChange;
|
recLists[REC_NPCC] = &npcChange;
|
||||||
//recLists[REC_PGRD] = &pathgrids;
|
recLists[REC_PGRD] = &pathgrids;
|
||||||
recLists[REC_PROB] = &probes;
|
recLists[REC_PROB] = &probes;
|
||||||
recLists[REC_RACE] = &races;
|
recLists[REC_RACE] = &races;
|
||||||
recLists[REC_REGN] = ®ions;
|
recLists[REC_REGN] = ®ions;
|
||||||
|
|
Loading…
Reference in a new issue