This is some pretty cool research, have you seen anything that would cause this problem:
If a model has vertices weighted to > 41 nodes, then the vertices will stretch.
I could give you examples if you want.
Printable View
This is some pretty cool research, have you seen anything that would cause this problem:
If a model has vertices weighted to > 41 nodes, then the vertices will stretch.
I could give you examples if you want.
Nope, I did this research a long time ago. If you could tell me where in the model structures this value is located, I could check it out. I barely know anything about modeling, just some direct3d stuff which helped greatly with this. Is a node another name for a single vertex?
A node is like the central point of activity. Like the bones on the cyborg model, that controls the arms, legs, and body movement. Or the frames on a warthog, that controls the wheels, suspension, and chaingun.
Gotcha. Well, I really need to reverse more model functions so I can figure out stuff for my Forge project. I'll post all my research in this thread. I just need a bit more info to hunt down your problem asap.
Must_spread_rep.
Dude, keep it to one thread!
Skarma you are just awesome
Skarma, post all future information in this thread and edit the OP to include a link to that post. This way we can keep all of your information together under one release thread and people wont have to go searching for each one.
edit: If you want me to give the thread a better name, just let me know.
This reminded me of a program I made to automatically build tag definitions from guerilla exported text files. It was originally built for kornmans old C# tag interface, but i've repurposed it to build definitions for OS. So the output isn't quite what you need but it might help somewhat.
Things to note though, it doesn't put any pads or flag/enum values and it doesn't check for duplicate names. No error checking and such either, so no guarantees or warranties :P.
Link.
Use empty/new tags when you export from guerilla, and its best to not export from guerilla with one of every block and sub block added as guerilla crashes if you do.
Typical I/O:
In
outCode:biped untitled
3
flags word flags 0
bounding radius real 0.000000
bounding offset real point 3d 0.000000 0.000000 0.000000
origin offset real point 3d 0.000000 0.000000 0.000000
acceleration scale real 0.000000
model tag reference mod2
animation graph tag reference antr
collision model tag reference coll
physics tag reference phys
modifier shader tag reference shdr
creation effect tag reference effe
render bounding radius real 0.000000
A in enum none
B in enum none
C in enum none
D in enum none
hud text message index short integer 0
forced shader permuation index short integer 0
attachments block 1
element 0
type tag reference ÿÿÿÿ
marker string
primary scale enum none
secondary scale enum none
change color enum none
end element 0
widgets block 1
element 0
reference tag reference ÿÿÿÿ
end element 0
functions block 1
element 0
flags long flags 0
period real 0.000000
scale period by enum none
function enum one
scale function by enum none
wobble function enum one
wobble period real 0.000000
wobble magnitude real 0.000000
square wave threshold real fraction 0.000000
step count short integer 0
map to enum linear
sawtooth count short integer 0
add enum none
scale result by enum none
bounds mode enum clip
bounds fraction bounds 0.000000 0.000000
turn off with short block index NONE -1
scale by real 0.000000
usage string
end element 0
change colors block 1
element 0
darken by enum none
scale by enum none
scale flags long flags 0
color lower bound real rgb color 0.000000 0.000000 0.000000
color upper bound real rgb color 0.000000 0.000000 0.000000
permutations block 1
element 0
weight real 0.000000
color lower bound real rgb color 0.000000 0.000000 0.000000
color upper bound real rgb color 0.000000 0.000000 0.000000
end element 0
end element 0
predicted resources block 1
element 0
type enum bitmap
resource index short integer 0
tag index long integer 0
end element 0
flags long flags 0
default team enum none
constant sound volume enum silent
rider damage fraction real 0.000000
integrated light toggle tag reference effe
A in enum none
B in enum none
C in enum none
D in enum none
camera field of view angle 0.000000
camera stiffness real 0.000000
camera marker name string
camera submerged marker name string
pitch auto-level angle 0.000000
pitch range angle bounds 0.000000 0.000000
camera tracks block 1
element 0
track tag reference trak
end element 0
seat acceleration scale real vector 3d 0.000000 0.000000 0.000000
soft ping threshold real 0.000000
soft ping interrupt time real 0.000000
hard ping threshold real 0.000000
hard ping interrupt time real 0.000000
hard death threshold real 0.000000
feign death threshold real 0.000000
feign death time real 0.000000
distance of evade anim real 0.000000
distance of dive anim real 0.000000
stunned movement threshold real 0.000000
feign death chance real 0.000000
feign repeat chance real 0.000000
spawned actor tag reference actv
spawned actor count short integer bounds 0 0
spawned velocity real 0.000000
aiming velocity maximum angle 0.000000
aiming acceleration maximum angle 0.000000
casual aiming modifier real fraction 0.000000
looking velocity maximum angle 0.000000
looking acceleration maximum angle 0.000000
AI vehicle radius real 0.000000
AI danger radius real 0.000000
melee damage tag reference jpt!
motion sensor blip size enum medium
NEW HUD INTERFACES block 1
element 0
unit hud interface tag reference unhi
end element 0
dialogue variants block 1
element 0
variant number short integer 0
dialogue tag reference udlg
end element 0
grenade velocity real 0.000000
grenade type enum human fragmentation
grenade count short integer 0
powered seats block 1
element 0
driver powerup time real 0.000000
driver powerdown time real 0.000000
end element 0
weapons block 1
element 0
weapon tag reference weap
end element 0
seats block 1
element 0
flags long flags 0
label string
marker name string
acceleration scale real vector 3d 0.000000 0.000000 0.000000
yaw rate real 0.000000
pitch rate real 0.000000
camera marker name string
camera submerged marker name string
pitch auto-level angle 0.000000
pitch range angle bounds 0.000000 0.000000
camera tracks block 1
element 0
track tag reference trak
end element 0
unit hud interface block 1
element 0
unit hud interface tag reference unhi
end element 0
hud text message index short integer 0
yaw minimum angle 0.000000
yaw maximum angle 0.000000
built-in gunner tag reference actv
end element 0
moving turning speed angle 0.000000
flags long flags 0
stationary turning threshold angle 0.000000
A in enum none
B in enum none
C in enum none
D in enum none
DON'T USE tag reference jpt!
bank angle angle 0.000000
bank apply time real 0.000000
bank decay time real 0.000000
pitch ratio real 0.000000
max velocity real 0.000000
max sidestep velocity real 0.000000
acceleration real 0.000000
deceleration real 0.000000
angular velocity maximum angle 0.000000
angular acceleration maximum angle 0.000000
crouch velocity modifier real 0.000000
maximum slope angle angle 0.000000
downhill falloff angle angle 0.000000
downhill cutoff angle angle 0.000000
downhill velocity scale real 0.000000
uphill falloff angle angle 0.000000
uphill cutoff angle angle 0.000000
uphill velocity scale real 0.000000
footsteps tag reference foot
jump velocity real 0.000000
maximum soft landing time real 0.000000
maximum hard landing time real 0.000000
minimum soft landing velocity real 0.000000
minimum hard landing velocity real 0.000000
maximum hard landing velocity real 0.000000
death hard landing velocity real 0.000000
standing camera height real 0.000000
crouching camera height real 0.000000
crouch transition time real 0.000000
standing collision height real 0.000000
crouching collision height real 0.000000
collision radius real 0.000000
autoaim width real 0.000000
contact points block 1
element 0
marker name string
end element 0
Code:#pragma region biped
struct biped_group
{
#pragma region Attachments
struct attachments_block
{
TAG_FIELD(tag_reference, type, "����");
TAG_FIELD(tag_string, marker);
TAG_FIELD(_enum, primary_scale);
TAG_FIELD(_enum, secondary_scale);
TAG_FIELD(_enum, change_color);
};
#pragma endregion
#pragma region Widgets
struct widgets_block
{
TAG_FIELD(tag_reference, reference, "����");
};
#pragma endregion
#pragma region Functions
struct functions_block
{
TAG_FIELD(long_flags, flags);
TAG_FIELD(real, period);
TAG_FIELD(_enum, scale_period_by);
TAG_FIELD(_enum, function);
TAG_FIELD(_enum, scale_function_by);
TAG_FIELD(_enum, wobble_function);
TAG_FIELD(real, wobble_period);
TAG_FIELD(real, wobble_magnitude);
TAG_FIELD(real_fraction, square_wave_threshold);
TAG_FIELD(int16, step_count);
TAG_FIELD(_enum, map_to);
TAG_FIELD(int16, sawtooth_count);
TAG_FIELD(_enum, add);
TAG_FIELD(_enum, scale_result_by);
TAG_FIELD(_enum, bounds_mode);
TAG_FIELD(tag_string, bounds);
TAG_FIELD(int16, turn_off_with);
TAG_FIELD(real, scale_by);
TAG_FIELD(tag_string, usage);
};
#pragma endregion
#pragma region Change Colors
struct change_colors_block
{
#pragma region Permutations
struct permutations_block
{
TAG_FIELD(real, weight);
TAG_FIELD(real_rgb_color, color_lower_bound);
TAG_FIELD(real_rgb_color, color_upper_bound);
};
#pragma endregion
TAG_FIELD(_enum, darken_by);
TAG_FIELD(_enum, scale_by);
TAG_FIELD(long_flags, scale_flags);
TAG_FIELD(real_rgb_color, color_lower_bound);
TAG_FIELD(real_rgb_color, color_upper_bound);
TAG_TBLOCK(permutations, permutations_block);
};
#pragma endregion
#pragma region Predicted Resources
struct predicted_resources_block
{
TAG_FIELD(_enum, type);
TAG_FIELD(int16, resource_index);
TAG_FIELD(int32, tag_index);
};
#pragma endregion
#pragma region Camera Tracks
struct camera_tracks_block
{
TAG_FIELD(tag_reference, track, "trak");
};
#pragma endregion
#pragma region NEW HUD INTERFACES
struct new_hud_interfaces_block
{
TAG_FIELD(tag_reference, unit_hud_interface, "unhi");
};
#pragma endregion
#pragma region Dialogue Variants
struct dialogue_variants_block
{
TAG_FIELD(int16, variant_number);
TAG_FIELD(tag_reference, dialogue, "udlg");
};
#pragma endregion
#pragma region Powered Seats
struct powered_seats_block
{
TAG_FIELD(real, driver_powerup_time);
TAG_FIELD(real, driver_powerdown_time);
};
#pragma endregion
#pragma region Weapons
struct weapons_block
{
TAG_FIELD(tag_reference, weapon, "weap");
};
#pragma endregion
#pragma region Seats
struct seats_block
{
#pragma region Camera Tracks
struct camera_tracks_block
{
TAG_FIELD(tag_reference, track, "trak");
};
#pragma endregion
#pragma region Unit Hud Interface
struct unit_hud_interface_block
{
TAG_FIELD(tag_reference, unit_hud_interface, "unhi");
};
#pragma endregion
TAG_FIELD(long_flags, flags);
TAG_FIELD(tag_string, label);
TAG_FIELD(tag_string, marker_name);
TAG_FIELD(real_vector3d, acceleration_scale);
TAG_FIELD(real, yaw_rate);
TAG_FIELD(real, pitch_rate);
TAG_FIELD(tag_string, camera_marker_name);
TAG_FIELD(tag_string, camera_submerged_marker_name);
TAG_FIELD(angle, pitch_auto_level);
TAG_FIELD(angle_bounds, pitch_range);
TAG_TBLOCK(camera_tracks, camera_tracks_block);
TAG_TBLOCK(unit_hud_interface, unit_hud_interface_block);
TAG_FIELD(int16, hud_text_message_index);
TAG_FIELD(angle, yaw_minimum);
TAG_FIELD(angle, yaw_maximum);
TAG_FIELD(tag_reference, built_in_gunner, "actv");
};
#pragma endregion
#pragma region Contact Points
struct contact_points_block
{
TAG_FIELD(tag_string, marker_name);
};
#pragma endregion
#pragma region Fields
TAG_FIELD(word_flags, flags);
TAG_FIELD(real, bounding_radius);
TAG_FIELD(real_point3d, bounding_offset);
TAG_FIELD(real_point3d, origin_offset);
TAG_FIELD(real, acceleration_scale);
TAG_FIELD(tag_reference, model, "mod2");
TAG_FIELD(tag_reference, animation_graph, "antr");
TAG_FIELD(tag_reference, collision_model, "coll");
TAG_FIELD(tag_reference, physics, "phys");
TAG_FIELD(tag_reference, modifier_shader, "shdr");
TAG_FIELD(tag_reference, creation_effect, "effe");
TAG_FIELD(real, render_bounding_radius);
TAG_FIELD(_enum, a_in);
TAG_FIELD(_enum, b_in);
TAG_FIELD(_enum, c_in);
TAG_FIELD(_enum, d_in);
TAG_FIELD(int16, hud_text_message_index);
TAG_FIELD(int16, forced_shader_permuation_index);
TAG_TBLOCK(attachments, attachments_block);
TAG_TBLOCK(widgets, widgets_block);
TAG_TBLOCK(functions, functions_block);
TAG_TBLOCK(change_colors, change_colors_block);
TAG_TBLOCK(predicted_resources, predicted_resources_block);
TAG_FIELD(long_flags, flags);
TAG_FIELD(_enum, default_team);
TAG_FIELD(_enum, constant_sound_volume);
TAG_FIELD(real, rider_damage_fraction);
TAG_FIELD(tag_reference, integrated_light_toggle, "effe");
TAG_FIELD(_enum, a_in);
TAG_FIELD(_enum, b_in);
TAG_FIELD(_enum, c_in);
TAG_FIELD(_enum, d_in);
TAG_FIELD(angle, camera_field_of_view);
TAG_FIELD(real, camera_stiffness);
TAG_FIELD(tag_string, camera_marker_name);
TAG_FIELD(tag_string, camera_submerged_marker_name);
TAG_FIELD(angle, pitch_auto_level);
TAG_FIELD(angle_bounds, pitch_range);
TAG_TBLOCK(camera_tracks, camera_tracks_block);
TAG_FIELD(real_vector3d, seat_acceleration_scale);
TAG_FIELD(real, soft_ping_threshold);
TAG_FIELD(real, soft_ping_interrupt_time);
TAG_FIELD(real, hard_ping_threshold);
TAG_FIELD(real, hard_ping_interrupt_time);
TAG_FIELD(real, hard_death_threshold);
TAG_FIELD(real, feign_death_threshold);
TAG_FIELD(real, feign_death_time);
TAG_FIELD(real, distance_of_evade_anim);
TAG_FIELD(real, distance_of_dive_anim);
TAG_FIELD(real, stunned_movement_threshold);
TAG_FIELD(real, feign_death_chance);
TAG_FIELD(real, feign_repeat_chance);
TAG_FIELD(tag_reference, spawned_actor, "actv");
TAG_FIELD(short_bounds, spawned_actor_count);
TAG_FIELD(real, spawned_velocity);
TAG_FIELD(angle, aiming_velocity_maximum);
TAG_FIELD(angle, aiming_acceleration_maximum);
TAG_FIELD(real_fraction, casual_aiming_modifier);
TAG_FIELD(angle, looking_velocity_maximum);
TAG_FIELD(angle, looking_acceleration_maximum);
TAG_FIELD(real, ai_vehicle_radius);
TAG_FIELD(real, ai_danger_radius);
TAG_FIELD(tag_reference, melee_damage, "jpt!");
TAG_FIELD(_enum, motion_sensor_blip_size);
TAG_TBLOCK(new_hud_interfaces, new_hud_interfaces_block);
TAG_TBLOCK(dialogue_variants, dialogue_variants_block);
TAG_FIELD(real, grenade_velocity);
TAG_FIELD(_enum, grenade_type);
TAG_FIELD(int16, grenade_count);
TAG_TBLOCK(powered_seats, powered_seats_block);
TAG_TBLOCK(weapons, weapons_block);
TAG_TBLOCK(seats, seats_block);
TAG_FIELD(angle, moving_turning_speed);
TAG_FIELD(long_flags, flags);
TAG_FIELD(angle, stationary_turning_threshold);
TAG_FIELD(_enum, a_in);
TAG_FIELD(_enum, b_in);
TAG_FIELD(_enum, c_in);
TAG_FIELD(_enum, d_in);
TAG_FIELD(tag_reference, don_t_use, "jpt!");
TAG_FIELD(angle, bank_angle);
TAG_FIELD(real, bank_apply_time);
TAG_FIELD(real, bank_decay_time);
TAG_FIELD(real, pitch_ratio);
TAG_FIELD(real, max_velocity);
TAG_FIELD(real, max_sidestep_velocity);
TAG_FIELD(real, acceleration);
TAG_FIELD(real, deceleration);
TAG_FIELD(angle, angular_velocity_maximum);
TAG_FIELD(angle, angular_acceleration_maximum);
TAG_FIELD(real, crouch_velocity_modifier);
TAG_FIELD(angle, maximum_slope_angle);
TAG_FIELD(angle, downhill_falloff_angle);
TAG_FIELD(angle, downhill_cutoff_angle);
TAG_FIELD(real, downhill_velocity_scale);
TAG_FIELD(angle, uphill_falloff_angle);
TAG_FIELD(angle, uphill_cutoff_angle);
TAG_FIELD(real, uphill_velocity_scale);
TAG_FIELD(tag_reference, footsteps, "foot");
TAG_FIELD(real, jump_velocity);
TAG_FIELD(real, maximum_soft_landing_time);
TAG_FIELD(real, maximum_hard_landing_time);
TAG_FIELD(real, minimum_soft_landing_velocity);
TAG_FIELD(real, minimum_hard_landing_velocity);
TAG_FIELD(real, maximum_hard_landing_velocity);
TAG_FIELD(real, death_hard_landing_velocity);
TAG_FIELD(real, standing_camera_height);
TAG_FIELD(real, crouching_camera_height);
TAG_FIELD(real, crouch_transition_time);
TAG_FIELD(real, standing_collision_height);
TAG_FIELD(real, crouching_collision_height);
TAG_FIELD(real, collision_radius);
TAG_FIELD(real, autoaim_width);
TAG_TBLOCK(contact_points, contact_points_block);
#pragma endregion
};
#pragma endregion
The only thing holding me back from using it. In Guerilla, some of the variable names are cutoff, so I might use it for those. I'm OCD when it comes to getting struct member offsets correct, which is why I like doing it manually and double check everything. I was even thinking about making a function to compare my struct sizes to the actual structs sizes, just to be sure I didn't miss anything lol!
I got a weird system going on for reversing tags lol First I open Halo CE and start a server. Then I use a function I wrote that iterates through the map tag index thats loaded in virtual memory and prints out the addresses of every tag of a specified taggroup and it's tag path. Then I open a tag group I want to reverse in Guerilla and go to the address in a memory hex editor that was printed out for the equivelent tag I opened in guerilla. The reason I don't just view the tags in a binary hex editor, is because guerillas tag format is not the same as when its compiled into the map and makes it confusing. Plus seeing where the pointers actually point to in memory is very helpful, I don't have to go using magic algos, I can just go to the pointer address.
For finding unknowns and padding, I changed variables in guerilla, saved the tag as a different name, then open both tags in a binary hex editor and switch back and forth looking for the changes lol. The way I do it is actually quite efficient for me even though it sounds rough
I've reversed quite a few tags already, it's just a slow process when there are so many different tags and tag blocks. I will post all completed ones.
Thanks for the info and app FireScythe. It will come in handy. Maybe you want to help with my Forge project, seeing as you are a very good coder. :downs: or maybe not