Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
N
Niflib
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Grant Kim
Niflib
Commits
ff876fcc
Commit
ff876fcc
authored
18 years ago
by
Shon Ferguson
Browse files
Options
Downloads
Patches
Plain Diff
Fixed some bugs in file writing.
parent
80215b01
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
niflib.cpp
+22
-12
22 additions, 12 deletions
niflib.cpp
with
22 additions
and
12 deletions
niflib.cpp
+
22
−
12
View file @
ff876fcc
...
...
@@ -16,7 +16,7 @@ bool global_block_map_init = false;
map
<
string
,
blk_factory_func
>
global_block_map
;
//Utility Functions
void
EnumerateObjects
(
NiObjectRef
const
&
root
,
map
<
Type
,
uint
>
&
type_map
,
map
<
NiObjectRef
,
uint
>
link_map
);
void
EnumerateObjects
(
NiObjectRef
const
&
root
,
map
<
Type
*
,
uint
>
&
type_map
,
map
<
NiObjectRef
,
uint
>
&
link_map
);
void
BuildUpBindPositions
(
const
NiAVObjectRef
&
av
);
NiObjectRef
FindRoot
(
vector
<
NiObjectRef
>
const
&
blocks
);
void
RegisterBlockFactories
();
...
...
@@ -226,7 +226,6 @@ vector<NiObjectRef> ReadNifList( istream & in ) {
//TODO: Actually read the user_version from the right place
uint
user_version
=
0
;
//--Read Blocks--//
vector
<
NiObjectRef
>
blocks
(
numBlocks
);
//List to hold the blocks
list
<
uint
>
link_stack
;
//List to add link values to as they're read in from the file
...
...
@@ -391,22 +390,26 @@ void WriteNifTree( ostream & out, NiObjectRef const & root, unsigned int version
//int block_count = ResetBlockNums( 0, root_block );
//Enumerate all objects in tree
map
<
Type
,
uint
>
type_map
;
map
<
Type
*
,
uint
>
type_map
;
map
<
NiObjectRef
,
uint
>
link_map
;
//cout << "Enumerating Objects..." << endl;
EnumerateObjects
(
root
,
type_map
,
link_map
);
//cout << "Building vectors for reverse look-up..." << endl;
//Build vectors for reverse look-up
vector
<
NiObjectRef
>
objects
(
link_map
.
size
());
for
(
map
<
NiObjectRef
,
uint
>::
iterator
it
=
link_map
.
begin
();
it
!=
link_map
.
end
();
++
it
)
{
//cout << "Objects[" << it->second << "] = " << it->first << endl;
objects
[
it
->
second
]
=
it
->
first
;
}
vector
<
const
Type
*>
types
(
type_map
.
size
());
for
(
map
<
Type
,
uint
>::
iterator
it
=
type_map
.
begin
();
it
!=
type_map
.
end
();
++
it
)
{
types
[
it
->
second
]
=
&
(
it
->
first
)
;
for
(
map
<
Type
*
,
uint
>::
iterator
it
=
type_map
.
begin
();
it
!=
type_map
.
end
();
++
it
)
{
types
[
it
->
second
]
=
it
->
first
;
}
//cout << "Writing Header..." << endl;
//--Write Header--//
//Version 10.0.1.0 is the last known to use the name NetImmerse
stringstream
header_string
;
...
...
@@ -448,7 +451,7 @@ void WriteNifTree( ostream & out, NiObjectRef const & root, unsigned int version
//Write type number of each block
for
(
uint
i
=
0
;
i
<
objects
.
size
();
++
i
)
{
WriteUShort
(
type_map
[
objects
[
i
]
->
GetType
()],
out
);
WriteUShort
(
type_map
[
(
Type
*
)
&
(
objects
[
i
]
->
GetType
()
)
],
out
);
}
...
...
@@ -456,11 +459,13 @@ void WriteNifTree( ostream & out, NiObjectRef const & root, unsigned int version
WriteUInt
(
0
,
out
);
}
//cout << "Writing objects..." << endl;
//--Write Objects--//
for
(
uint
i
=
0
;
i
<
objects
.
size
();
++
i
)
{
if
(
version
<
0x05000001
)
{
//cout << i << ": " <<
blk_list[i]->GetBlockTyp
e() << endl;
//cout << i << ": " <<
objects[i]->GetType().GetTypeNam
e() << endl;
//Write Block Type
WriteString
(
objects
[
i
]
->
GetType
().
GetTypeName
()
,
out
);
}
else
if
(
version
>=
0x05000001
&&
version
<=
VER_10_1_0_0
)
{
...
...
@@ -470,12 +475,14 @@ void WriteNifTree( ostream & out, NiObjectRef const & root, unsigned int version
objects
[
i
]
->
Write
(
out
,
link_map
,
version
,
user_version
);
}
//cout << "Writing footer.." << endl;
//--Write Footer--//
WriteUInt
(
1
,
out
);
// Unknown Int = 1 (usually)
WriteUInt
(
0
,
out
);
// Unknown Int = 0 (usually)
}
void
EnumerateObjects
(
NiObjectRef
const
&
root
,
map
<
Type
,
uint
>
&
type_map
,
map
<
NiObjectRef
,
uint
>
link_map
)
{
void
EnumerateObjects
(
NiObjectRef
const
&
root
,
map
<
Type
*
,
uint
>
&
type_map
,
map
<
NiObjectRef
,
uint
>
&
link_map
)
{
//Ensure that this object has not already been visited
if
(
link_map
.
find
(
root
)
!=
link_map
.
end
()
)
{
//This object has already been visited. Return.
...
...
@@ -486,16 +493,19 @@ void EnumerateObjects( NiObjectRef const & root, map<Type,uint> & type_map, map<
link_map
[
root
]
=
uint
(
link_map
.
size
());
//Add this object type to the map if it isn't there already
if
(
type_map
.
find
(
root
->
GetType
()
)
==
type_map
.
end
()
)
{
if
(
type_map
.
find
(
(
Type
*
)
&
(
root
->
GetType
()
)
)
==
type_map
.
end
()
)
{
//The type has not yet been registered, so register it
type_map
[
root
->
GetType
()]
=
uint
(
type_map
.
size
());
//cout << "Types[" << uint(type_map.size()) << "] = " << root->GetType().GetTypeName() << endl;
type_map
[
(
Type
*
)
&
(
root
->
GetType
())
]
=
uint
(
type_map
.
size
());
}
//Call this function on all links of this object
list
<
NiObjectRef
>
links
=
root
->
GetRefs
();
for
(
list
<
NiObjectRef
>::
iterator
it
=
links
.
begin
();
it
!=
links
.
end
();
++
it
)
{
EnumerateObjects
(
*
it
,
type_map
,
link_map
);
if
(
*
it
!=
NULL
)
{
EnumerateObjects
(
*
it
,
type_map
,
link_map
);
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment