Cleanup and minor refactoring in model.cc/hh

This commit is contained in:
ROllerozxa 2026-06-05 20:22:28 +02:00
commit a9fffcd18f
3 changed files with 386 additions and 391 deletions

View file

@ -1693,7 +1693,7 @@ static int initial_loader(int step) {
mesh_factory::init_models(); mesh_factory::init_models();
char msg[128]; char msg[128];
snprintf(msg, 127, "Loading model %d/%d", cur_mesh+1, NUM_MODELS); snprintf(msg, 127, "Loading model %d/%d", mesh_factory::cur_mesh+1, NUM_MODELS);
P.s_loading_screen->set_text(msg); P.s_loading_screen->set_text(msg);
} break; } break;
@ -1706,7 +1706,7 @@ static int initial_loader(int step) {
} }
char msg[128]; char msg[128];
snprintf(msg, 127, "Loading model %d/%d", cur_mesh+1, NUM_MODELS); snprintf(msg, 127, "Loading model %d/%d", mesh_factory::cur_mesh+1, NUM_MODELS);
P.s_loading_screen->set_text(msg); P.s_loading_screen->set_text(msg);
if (ret) { if (ret) {

View file

@ -7,319 +7,320 @@
struct tms_model *model_misc[NUM_MISC_MODELS]; struct tms_model *model_misc[NUM_MISC_MODELS];
int cur_model = 0; int cur_model = 0;
#define MODEL_CACHE_VERSION 34 #define cache_path_VERSION 34
static int i1o1_shift_i = 1; static int i1o1_shift_i = 1;
static int i2o1_shift_i = 1; static int i2o1_shift_i = 1;
static int cpad_shift_i = 1; static int cpad_shift_i = 1;
#define PATH(x) "data/models/" x ".3ds"
struct model_load_data mesh_factory::models[NUM_MODELS] = { struct model_load_data mesh_factory::models[NUM_MODELS] = {
{"data/models/plank1.3ds"}, {PATH("plank1")},
{"data/models/plank2.3ds"}, {PATH("plank2")},
{"data/models/plank3.3ds"}, {PATH("plank3")},
{"data/models/plank4.3ds"}, {PATH("plank4")},
{"data/models/thinplank1.3ds"}, {PATH("thinplank1")},
{"data/models/thinplank2.3ds"}, {PATH("thinplank2")},
{"data/models/thinplank3.3ds"}, {PATH("thinplank3")},
{"data/models/thinplank4.3ds"}, {PATH("thinplank4")},
{"data/models/splank.3ds"}, {PATH("splank")},
{"data/models/splank1.3ds"}, {PATH("splank1")},
{"data/models/splank2.3ds"}, {PATH("splank2")},
{"data/models/splank3.3ds"}, {PATH("splank3")},
{"data/models/splank_front.3ds"}, {PATH("splank_front")},
{"data/models/splank_back.3ds"}, {PATH("splank_back")},
{"data/models/impact1.3ds"}, {PATH("impact1")},
{"data/models/impact2.3ds"}, {PATH("impact2")},
{"data/models/impact3.3ds"}, {PATH("impact3")},
{"data/models/impact4.3ds"}, {PATH("impact4")},
{"data/models/field1.3ds"}, {PATH("field1")},
{"data/models/field2.3ds"}, {PATH("field2")},
{"data/models/field3.3ds"}, {PATH("field3")},
{"data/models/field4.3ds"}, {PATH("field4")},
{"data/models/room.3ds"}, {PATH("room")},
{"data/models/room_corner_1.3ds"}, {PATH("room_corner_1")},
{"data/models/room_corner_2.3ds"}, {PATH("room_corner_2")},
{"data/models/room_corner_3.3ds"}, {PATH("room_corner_3")},
{"data/models/room_corner_4.3ds"}, {PATH("room_corner_4")},
{"data/models/arm_shotgun.3ds"}, {PATH("arm_shotgun")},
{"data/models/arm_bomber.3ds"}, {PATH("arm_bomber")},
{"data/models/arm_bomber_chamber.3ds"}, {PATH("arm_bomber_chamber")},
{"data/models/arm_railgun.3ds"}, {PATH("arm_railgun")},
{"data/models/diamond.3ds"}, {PATH("diamond")},
{"data/models/ruby.3ds"}, {PATH("ruby")},
{"data/models/stone.3ds"}, {PATH("stone")},
{"data/models/weight.3ds"}, {PATH("weight")},
{"data/models/separator.3ds"}, {PATH("separator")},
{"data/models/robot.3ds"}, {PATH("robot")},
{"data/models/robot_gunarm.3ds"}, {PATH("robot_gunarm")},
{"data/models/robot_dragarm.3ds"}, {PATH("robot_dragarm")},
{"data/models/robot_head.3ds"}, {PATH("robot_head")},
{"data/models/robot_body.3ds"}, {PATH("robot_body")},
{"data/models/robot_back.3ds"}, {PATH("robot_back")},
{"data/models/robot_front.3ds"}, {PATH("robot_front")},
{"data/models/feet_frame.3ds"}, {PATH("feet_frame")},
{"data/models/bot.3ds"}, {PATH("bot")},
{"data/models/spikebot-2.3ds"}, {PATH("spikebot-2")},
{"data/models/minibot.3ds"}, {PATH("minibot")},
{"data/models/bomber.3ds"}, {PATH("bomber")},
{"data/models/sphere.3ds"}, {PATH("sphere")},
{"data/models/sphere2.3ds"}, {PATH("sphere2")},
{"data/models/sphere3.3ds"}, {PATH("sphere3")},
{"data/models/generator.3ds"}, {PATH("generator")},
{"data/models/battery3v.3ds"}, {PATH("battery3v")},
{"data/models/wmotor.3ds"}, {PATH("wmotor")},
{"data/models/flatmotor.3ds"}, {PATH("flatmotor")},
{"data/models/simplemotor.3ds"}, {PATH("simplemotor")},
{"data/models/gear0.3ds"}, {PATH("gear0")},
{"data/models/gear1.3ds"}, {PATH("gear1")},
{"data/models/gear2.3ds"}, {PATH("gear2")},
{"data/models/gear3.3ds"}, {PATH("gear3")},
{"data/models/trampolinebase.3ds"}, {PATH("trampolinebase")},
{"data/models/trampolinepad.3ds"}, {PATH("trampolinepad")},
{"data/models/plug.simple.3ds"}, {PATH("plug.simple")},
{"data/models/plug.simple.low.3ds"}, {PATH("plug.simple.low")},
{"data/models/plug.male.3ds"}, {PATH("plug.male")},
{"data/models/plug.female.3ds"}, {PATH("plug.female")},
{"data/models/plug.transmitter.3ds"}, {PATH("plug.transmitter")},
{"data/models/c_ifplug.male.3ds"}, {PATH("c_ifplug.male")},
{"data/models/c_ifplug.female.3ds"}, {PATH("c_ifplug.female")},
{"data/models/script.3ds"}, {PATH("script")},
{"data/models/sticky.3ds"}, {PATH("sticky")},
{"data/models/breadboard.3ds"}, {PATH("breadboard")},
{"data/models/motor.3ds"}, {PATH("motor")},
{"data/models/wheel.3ds"}, {PATH("wheel")},
{"data/models/cup.3ds"}, {PATH("cup")},
{"data/models/cylinder05.3ds"}, {PATH("cylinder05")},
{"data/models/cylinder1.3ds"}, {PATH("cylinder1")},
{"data/models/cylinder1.5.3ds"}, {PATH("cylinder1.5")},
{"data/models/cylinder2.3ds"}, {PATH("cylinder2")},
{"data/models/wallthing00.3ds"}, {PATH("wallthing00")},
{"data/models/wallthing0.3ds"}, {PATH("wallthing0")},
{"data/models/wallthing1.3ds"}, {PATH("wallthing1")},
{"data/models/wallthing2.3ds"}, {PATH("wallthing2")},
{"data/models/joint.3ds"}, {PATH("joint")},
{"data/models/plate.3ds"}, {PATH("plate")},
{"data/models/platejoint_damaged.3ds"}, {PATH("platejoint_damaged")},
{"data/models/pivotjoint.3ds"}, {PATH("pivotjoint")},
{"data/models/corner.3ds"}, {PATH("corner")},
{"data/models/panel.big.3ds"}, {PATH("panel.big")},
{"data/models/panel.medium.3ds"}, {PATH("panel.medium")},
{"data/models/panel.small.3ds"}, {PATH("panel.small")},
{"data/models/switch.3ds"}, {PATH("switch")},
{"data/models/robotman.3ds"}, {PATH("robotman")},
{"data/models/magnet.3ds"}, {PATH("magnet")},
{"data/models/railstraight.3ds"}, {PATH("railstraight")},
{"data/models/railturn.3ds"}, {PATH("railturn")},
{"data/models/railskewed.3ds"}, {PATH("railskewed")},
{"data/models/railskewed2.3ds"}, {PATH("railskewed2")},
{"data/models/gyroscope.3ds"}, {PATH("gyroscope")},
{"data/models/tiltmeter.3ds"}, {PATH("tiltmeter")},
{"data/models/lmotor0.3ds"}, {PATH("lmotor0")},
{"data/models/lmotor1.3ds"}, {PATH("lmotor1")},
{"data/models/lmotor2.3ds"}, {PATH("lmotor2")},
{"data/models/lmotor3.3ds"}, {PATH("lmotor3")},
{"data/models/lmotor0_r.3ds"}, {PATH("lmotor0_r")},
{"data/models/lmotor1_r.3ds"}, {PATH("lmotor1_r")},
{"data/models/lmotor2_r.3ds"}, {PATH("lmotor2_r")},
{"data/models/lmotor3_r.3ds"}, {PATH("lmotor3_r")},
{"data/models/magplug.3ds"}, {PATH("magplug")},
{"data/models/magsocket.3ds"}, {PATH("magsocket")},
{"data/models/fifo.3ds"}, {PATH("fifo")},
{"data/models/seesaw.3ds"}, {PATH("seesaw")},
{"data/models/pivot.3ds"}, {PATH("pivot")},
{"data/models/anchor.3ds"}, {PATH("anchor")},
{"data/models/limb.3ds"}, {PATH("limb")},
{"data/models/bullet.3ds"}, {PATH("bullet")},
{"data/models/missile.3ds"}, {PATH("missile")},
{"data/models/ropeend.3ds"}, {PATH("ropeend")},
{"data/models/pipeline.base.3ds"}, {PATH("pipeline.base")},
{"data/models/pipeline.piston.3ds"}, {PATH("pipeline.piston")},
{"data/models/pipeline.house.3ds"}, {PATH("pipeline.house")},
{"data/models/clip.3ds"}, {PATH("clip")},
{"data/models/cclip.3ds"}, {PATH("cclip")},
{"data/models/landmine.3ds"}, {PATH("landmine")},
{"data/models/gearbox.3ds"}, {PATH("gearbox")},
{"data/models/box_notex.3ds"}, {PATH("box_notex")},
{"data/models/box_tex.3ds"}, {PATH("box_tex")},
{"data/models/tribox_tex0.3ds"}, {PATH("tribox_tex0")},
{"data/models/tribox_tex1.3ds"}, {PATH("tribox_tex1")},
{"data/models/tribox_tex2.3ds"}, {PATH("tribox_tex2")},
{"data/models/tribox_tex3.3ds"}, {PATH("tribox_tex3")},
{"data/models/gb.axle.3ds"}, {PATH("gb.axle")},
{"data/models/gb.4.3ds"}, {PATH("gb.4")},
{"data/models/gb.6.3ds"}, {PATH("gb.6")},
{"data/models/gb.8.3ds"}, {PATH("gb.8")},
{"data/models/gb.10.3ds"}, {PATH("gb.10")},
{"data/models/gb.12.3ds"}, {PATH("gb.12")},
{"data/models/controller.mini.3ds"}, {PATH("controller.mini")},
{"data/models/controller.pass.3ds"}, {PATH("controller.pass")},
{"data/models/controller.servo.3ds"}, {PATH("controller.servo")},
{"data/models/controller.fplus.3ds"}, {PATH("controller.fplus")},
{"data/models/damper_0.3ds"}, {PATH("damper_0")},
{"data/models/damper_1.3ds"}, {PATH("damper_1")},
{"data/models/display.3ds"}, {PATH("display")},
{"data/models/display_active.3ds"}, {PATH("display_active")},
{"data/models/crane.3ds"}, {PATH("crane")},
{"data/models/border-new.3ds"}, {PATH("border-new")},
{"data/models/scanner.3ds"}, {PATH("scanner")},
{"data/models/mirror.3ds"}, {PATH("mirror")},
{"data/models/lasersensor.3ds"}, {PATH("lasersensor")},
{"data/models/rocket.3ds"}, {PATH("rocket")},
{"data/models/thruster.3ds"}, {PATH("thruster")},
{"data/models/bomb.3ds"}, {PATH("bomb")},
{"data/models/plasma_gun_inner.3ds"}, {PATH("plasma_gun_inner")},
{"data/models/plasma_gun.3ds"}, {PATH("plasma_gun")},
{"data/models/tesla_gun.3ds"}, {PATH("tesla_gun")},
{"data/models/mega_buster.3ds"}, {PATH("mega_buster")},
{"data/models/arm_rocket_launcher.3ds"}, {PATH("arm_rocket_launcher")},
{"data/models/btn.3ds"}, {PATH("btn")},
{"data/models/btn_switch.3ds"}, {PATH("btn_switch")},
{"data/models/proximity.3ds"}, {PATH("proximity")},
{"data/models/gameman.3ds"}, {PATH("gameman")},
{"data/models/debris.3ds"}, {PATH("debris")},
{"data/models/box1.3ds"}, {PATH("box1")},
{"data/models/box2.3ds"}, {PATH("box2")},
{"data/models/debugger_0.3ds"}, {PATH("debugger_0")},
{"data/models/debugger_1.3ds"}, {PATH("debugger_1")},
{"data/models/graph.3ds"}, {PATH("graph")},
{"data/models/estabilizer.3ds"}, {PATH("estabilizer")},
{"data/models/factory_generic.3ds"}, {PATH("factory_generic")},
{"data/models/factory_robot.3ds"}, {PATH("factory_robot")},
{"data/models/factory_armory.3ds"}, {PATH("factory_armory")},
{"data/models/factory_oil_mixer.3ds"}, {PATH("factory_oil_mixer")},
{"data/models/repair_station.3ds"}, {PATH("repair_station")},
{"data/models/ladder.3ds"}, {PATH("ladder")},
{"data/models/jetpack.3ds"}, {PATH("jetpack")},
{"data/models/advanced_jetpack.3ds"}, {PATH("advanced_jetpack")},
{"data/models/pig.3ds"}, {PATH("pig")},
{"data/models/cow.3ds"}, {PATH("cow")},
{"data/models/cow_head.3ds"}, {PATH("cow_head")},
{"data/models/pig_head.3ds"}, {PATH("pig_head")},
{"data/models/leaves1.3ds"}, {PATH("leaves1")},
{"data/models/emitter.3ds"}, {PATH("emitter")},
{"data/models/emitter_frame.3ds"}, {PATH("emitter_frame")},
{"data/models/miniemitter.3ds"}, {PATH("miniemitter")},
{"data/models/rubberend.3ds"}, {PATH("rubberend")},
{"data/models/i0o1.3ds"}, {PATH("i0o1")},
{"data/models/i0o2.3ds"}, {PATH("i0o2")},
{"data/models/i0o3.3ds"}, {PATH("i0o3")},
{"data/models/i1o0.3ds"}, {PATH("i1o0")},
{"data/models/i1o2.3ds"}, {PATH("i1o2")},
{"data/models/i1o3.3ds"}, {PATH("i1o3")},
{"data/models/i1o4.3ds"}, {PATH("i1o4")},
{"data/models/i1o8.3ds"}, {PATH("i1o8")},
{"data/models/i2o0.3ds"}, {PATH("i2o0")},
{"data/models/i2o2.3ds"}, {PATH("i2o2")},
{"data/models/i3o1.3ds"}, {PATH("i3o1")},
{"data/models/i4o0.3ds"}, {PATH("i4o0")},
{"data/models/i4o1.3ds"}, {PATH("i4o1")},
{"data/models/pointer_body.3ds"}, {PATH("pointer_body")},
{"data/models/pointer_arrow.3ds"}, {PATH("pointer_arrow")},
{"data/models/dragfield.3ds"}, {PATH("dragfield")},
{"data/models/gravity.3ds"}, {PATH("gravity")},
{"data/models/gravityset.3ds"}, {PATH("gravityset")},
{"data/models/spikes.3ds"}, {PATH("spikes")},
{"data/models/backpack.3ds"}, {PATH("backpack")},
{"data/models/adamper.3ds"}, {PATH("adamper")},
{"data/models/checkpoint.3ds"}, {PATH("checkpoint")},
{"data/models/fan.3ds"}, {PATH("fan")},
{"data/models/fan_blades.3ds"}, {PATH("fan_blades")},
{"data/models/transmitter.3ds"}, {PATH("transmitter")},
{"data/models/barrel.3ds"}, {PATH("barrel")},
{"data/models/heisenberg.3ds"}, {PATH("heisenberg")},
{"data/models/wizardhat.3ds"}, {PATH("wizardhat")},
{"data/models/ninjahelmet.3ds"}, {PATH("ninjahelmet")},
{"data/models/robe.3ds"}, {PATH("robe")},
{"data/models/suctioncup.3ds"}, {PATH("suctioncup")},
{"data/models/canister.3ds"}, {PATH("canister")},
{"data/models/oilrig.3ds"}, {PATH("oilrig")},
{"data/models/conveyor0.3ds"}, {PATH("conveyor0")},
{"data/models/conveyor1.3ds"}, {PATH("conveyor1")},
{"data/models/conveyor2.3ds"}, {PATH("conveyor2")},
{"data/models/conveyor3.3ds"}, {PATH("conveyor3")},
{"data/models/conveyor4.3ds"}, {PATH("conveyor4")},
{"data/models/conveyor5.3ds"}, {PATH("conveyor5")},
{"data/models/robot_head_inside.3ds"}, {PATH("robot_head_inside")},
{"data/models/conicalhat.3ds"}, {PATH("conicalhat")},
{"data/models/ostrich.3ds"}, {PATH("ostrich")},
{"data/models/ostrich_head.3ds"}, {PATH("ostrich_head")},
{"data/models/policehat.3ds"}, {PATH("policehat")},
{"data/models/circuit.3ds"}, {PATH("circuit")},
{"data/models/oilbarrel.3ds"}, {PATH("oilbarrel")},
{"data/models/canister_armour.3ds"}, {PATH("canister_armour")},
{"data/models/canister_speed.3ds"}, {PATH("canister_speed")},
{"data/models/canister_jump.3ds"}, {PATH("canister_jump")},
{"data/models/ore.3ds"}, {PATH("ore")},
{"data/models/ore_inside.3ds"}, {PATH("ore_inside")},
{"data/models/ore2.3ds"}, {PATH("ore2")},
{"data/models/ore2_inside.3ds"}, {PATH("ore2_inside")},
{"data/models/vendor.3ds"}, {PATH("vendor")},
{"data/models/treasurechest.3ds"}, {PATH("treasurechest")},
{"data/models/builder.3ds"}, {PATH("builder")},
{"data/models/miner.3ds"}, {PATH("miner")},
{"data/models/factionwand.3ds"}, {PATH("factionwand")},
{"data/models/boltset_steel.3ds"}, {PATH("boltset_steel")},
{"data/models/boltset_wood.3ds"}, {PATH("boltset_wood")},
{"data/models/boltset_titanium.3ds"}, {PATH("boltset_titanium")},
{"data/models/boltset_diamond.3ds"}, {PATH("boltset_diamond")},
{"data/models/lobber.3ds"}, {PATH("lobber")},
{"data/models/spikeball.3ds"}, {PATH("spikeball")},
{"data/models/guardpoint.3ds"}, {PATH("guardpoint")},
{"data/models/stone1.3ds"}, {PATH("stone1")},
{"data/models/stone2.3ds"}, {PATH("stone2")},
{"data/models/stone3.3ds"}, {PATH("stone3")},
{"data/models/stone4.3ds"}, {PATH("stone4")},
{"data/models/stone5.3ds"}, {PATH("stone5")},
{"data/models/stone6.3ds"}, {PATH("stone6")},
{"data/models/mushroom1.3ds"}, {PATH("mushroom1")},
{"data/models/mushroom2.3ds"}, {PATH("mushroom2")},
{"data/models/mushroom3.3ds"}, {PATH("mushroom3")},
{"data/models/mushroom4.3ds"}, {PATH("mushroom4")},
{"data/models/mushroom5.3ds"}, {PATH("mushroom5")},
{"data/models/mushroom6.3ds"}, {PATH("mushroom6")},
{"data/models/leaves2.3ds"}, {PATH("leaves2")},
{"data/models/leaves3.3ds"}, {PATH("leaves3")},
{"data/models/sign1.3ds"}, {PATH("sign1")},
{"data/models/sign2.3ds"}, {PATH("sign2")},
{"data/models/sign3.3ds"}, {PATH("sign3")},
{"data/models/sign4.3ds"}, {PATH("sign4")},
{"data/models/wood.3ds"}, {PATH("wood")},
{"data/models/fence.3ds"}, {PATH("fence")},
{"data/models/tophat.3ds"}, {PATH("tophat")},
{"data/models/compressor.3ds"}, {PATH("compressor")},
{"data/models/compressor_lamp1.3ds"}, {PATH("compressor_lamp1")},
{"data/models/compressor_lamp2.3ds"}, {PATH("compressor_lamp2")},
{"data/models/compressor_lamp3.3ds"}, {PATH("compressor_lamp3")},
{"data/models/compressor_lamp4.3ds"}, {PATH("compressor_lamp4")},
{"data/models/ladder_step.3ds"}, {PATH("ladder_step")},
{"data/models/kingscrown.3ds"}, {PATH("kingscrown")},
{"data/models/dummy_head.3ds"}, {PATH("dummy_head")},
{"data/models/statue_head.3ds"}, {PATH("statue_head")},
{"data/models/jesterhat.3ds"}, {PATH("jesterhat")},
{"data/models/woodsword.3ds"}, {PATH("woodsword")},
{"data/models/hammer.3ds"}, {PATH("hammer")},
{"data/models/witch_hat.3ds"}, {PATH("witch_hat")},
{"data/models/simple_axe.3ds"}, {PATH("simple_axe")},
{"data/models/saw1.3ds"}, {PATH("saw1")},
{"data/models/saw.3ds"}, {PATH("saw")},
{"data/models/saw_blade.3ds"}, {PATH("saw_blade")},
{"data/models/spiked_club.3ds"}, {PATH("spiked_club")},
{"data/models/steel_sword.3ds"}, {PATH("steel_sword")},
{"data/models/baseballbat.3ds"}, {PATH("baseballbat")},
{"data/models/spear.3ds"}, {PATH("spear")},
{"data/models/plant1.3ds"}, {PATH("plant1")},
{"data/models/plant2.3ds"}, {PATH("plant2")},
{"data/models/plant3.3ds"}, {PATH("plant3")},
{"data/models/plant4.3ds"}, {PATH("plant4")},
{"data/models/war_axe.3ds"}, {PATH("war_axe")},
{"data/models/pixel_sword.3ds"}, {PATH("pixel_sword")},
{"data/models/hard_hat.3ds"}, {PATH("hard_hat")},
{"data/models/serpent_sword.3ds"}, {PATH("serpent_sword")},
{"data/models/pioneer_front.3ds"}, {PATH("pioneer_front")},
{"data/models/pioneer_back.3ds"}, {PATH("pioneer_back")},
{"data/models/vikinghelmet.3ds"}, {PATH("vikinghelmet")},
{"data/models/pickaxe.3ds"}, {PATH("pickaxe")},
{"data/models/i1o1.3ds"}, // MODEL_I1O1_EMPTY {PATH("i1o1")}, // MODEL_I1O1_EMPTY
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_INTEGER {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_INTEGER
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_SQUARE {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_SQUARE
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_SQRT {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_SQRT
@ -327,19 +328,19 @@ struct model_load_data mesh_factory::models[NUM_MODELS] = {
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_BESSERWISSER {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_BESSERWISSER
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_EPSILON {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_EPSILON
{0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_INVERT {0, MODEL_I1O1_EMPTY, tvec2f(0.f, -.125f*i1o1_shift_i++)}, // MODEL_I1O1_INVERT
{"data/models/i2o1_empty.3ds"}, // MODEL_I2O1_EMPTY {PATH("i2o1_empty")}, // MODEL_I2O1_EMPTY
{"data/models/i2o1_1.3ds"}, // MODEL_I2O1_AND {PATH("i2o1_1")}, // MODEL_I2O1_AND
{"data/models/i2o1_2.3ds"}, // MODEL_I2O1_OR {PATH("i2o1_2")}, // MODEL_I2O1_OR
{"data/models/i2o1_3.3ds"}, // MODEL_I2O1_XOR {PATH("i2o1_3")}, // MODEL_I2O1_XOR
{"data/models/i2o1_4.3ds"}, // MODEL_I2O1_NAND {PATH("i2o1_4")}, // MODEL_I2O1_NAND
{"data/models/i2o1_5.3ds"}, // MODEL_I2O1_EQUAL {PATH("i2o1_5")}, // MODEL_I2O1_EQUAL
{"data/models/i2o1_6.3ds"}, // MODEL_I2O1_LESS {PATH("i2o1_6")}, // MODEL_I2O1_LESS
{"data/models/i2o1_7.3ds"}, // MODEL_I2O1_LESS_EQUAL {PATH("i2o1_7")}, // MODEL_I2O1_LESS_EQUAL
{"data/models/i2o1_8.3ds"}, // MODEL_I2O1_SUM {PATH("i2o1_8")}, // MODEL_I2O1_SUM
{"data/models/i2o1_9.3ds"}, // MODEL_I2O1_WRAP_ADD {PATH("i2o1_9")}, // MODEL_I2O1_WRAP_ADD
{"data/models/i2o1_10.3ds"}, // MODEL_I2O1_WRAP_SUB {PATH("i2o1_10")}, // MODEL_I2O1_WRAP_SUB
{"data/models/i2o1_11.3ds"}, // MODEL_I2O1_UNUSED {PATH("i2o1_11")}, // MODEL_I2O1_UNUSED
{"data/models/cpad.3ds"}, {PATH("cpad")},
// Different command pad variants, shift the texture used for each while reusing the model // Different command pad variants, shift the texture used for each while reusing the model
{0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)}, {0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)},
{0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)}, {0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)},
@ -358,44 +359,43 @@ struct model_load_data mesh_factory::models[NUM_MODELS] = {
{0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)}, {0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)},
{0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)} {0, MODEL_CPAD, tvec2f(0.f, (-1.f/16.f)*cpad_shift_i++)}
}; };
#undef PATH
static char cache_path[512]; int mesh_factory::cur_mesh = 0;
static bool use_cache = false;
static bool char mesh_factory::cache_path[512];
open_cache(lvlbuf *lb) bool mesh_factory::use_cache = false;
{
bool mesh_factory::open_cache(lvlbuf *lb) {
FILE *fp = fopen(cache_path, "rb"); FILE *fp = fopen(cache_path, "rb");
if (fp) { if (!fp) {
fseek(fp, 0, SEEK_END); tms_errorf("Unable to open cache_path %s", cache_path);
long size = ftell(fp); return false;
fseek(fp, 0, SEEK_SET);
lb->reset();
lb->size = 0;
lb->ensure((int)size);
fread(lb->buf, 1, size, fp);
fclose(fp);
lb->size = size;
return true;
} }
tms_errorf("Unable to open cache_path %s", cache_path); fseek(fp, 0, SEEK_END);
return false; long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
lb->reset();
lb->size = 0;
lb->ensure((int)size);
fread(lb->buf, 1, size, fp);
fclose(fp);
lb->size = size;
return true;
} }
static bool bool mesh_factory::read_cache(lvlbuf *lb) {
read_cache(lvlbuf *lb)
{
uint8_t version = lb->r_uint8(); uint8_t version = lb->r_uint8();
uint32_t num_meshes = lb->r_uint32(); uint32_t num_meshes = lb->r_uint32();
uint32_t num_models = lb->r_uint32(); uint32_t num_models = lb->r_uint32();
if (version != MODEL_CACHE_VERSION) { if (version != cache_path_VERSION) {
tms_errorf("Mismatching version code in model cache."); tms_errorf("Mismatching version code in model cache.");
return false; return false;
} }
@ -411,7 +411,7 @@ read_cache(lvlbuf *lb)
} }
char *data; char *data;
for (int x=0; x<num_models; ++x) { for (int x = 0; x < num_models; ++x) {
struct tms_model *m = (struct tms_model*)calloc(1, sizeof(struct tms_model)); struct tms_model *m = (struct tms_model*)calloc(1, sizeof(struct tms_model));
uint32_t vertices_size = lb->r_uint32(); uint32_t vertices_size = lb->r_uint32();
@ -434,7 +434,7 @@ read_cache(lvlbuf *lb)
uint32_t num_meshes = lb->r_uint32(); uint32_t num_meshes = lb->r_uint32();
for (int n=0; n<num_meshes; ++n) { for (int n = 0; n < num_meshes; ++n) {
struct tms_mesh *mesh = tms_model_create_mesh(m); struct tms_mesh *mesh = tms_model_create_mesh(m);
mesh->id = lb->r_int32(); mesh->id = lb->r_int32();
@ -456,14 +456,12 @@ read_cache(lvlbuf *lb)
return true; return true;
} }
static bool bool mesh_factory::write_cache(lvlbuf *lb) {
write_cache(lvlbuf *lb) lb->w_s_uint8(cache_path_VERSION);
{
lb->w_s_uint8(MODEL_CACHE_VERSION);
lb->w_s_uint32(NUM_MODELS); lb->w_s_uint32(NUM_MODELS);
lb->w_s_uint32(NUM_MISC_MODELS); lb->w_s_uint32(NUM_MISC_MODELS);
for (int x=0; x<NUM_MISC_MODELS; ++x) { for (int x = 0; x < NUM_MISC_MODELS; ++x) {
struct tms_model *m = model_misc[x]; struct tms_model *m = model_misc[x];
lb->w_s_uint32(m->vertices->size); lb->w_s_uint32(m->vertices->size);
@ -492,23 +490,17 @@ write_cache(lvlbuf *lb)
return true; return true;
} }
static bool bool mesh_factory::save_cache(lvlbuf *lb) {
save_cache(lvlbuf *lb)
{
FILE *fp = fopen(cache_path, "wb"); FILE *fp = fopen(cache_path, "wb");
if (fp) { if (!fp)
fwrite(lb->buf, 1, lb->size, fp); return false;
fclose(fp);
return true; fwrite(lb->buf, 1, lb->size, fp);
} fclose(fp);
return true;
return false;
} }
void void mesh_factory::init_models() {
mesh_factory::init_models(void)
{
snprintf(cache_path, 511, "%s/models.cache", tms_storage_cache_path()); snprintf(cache_path, 511, "%s/models.cache", tms_storage_cache_path());
GLuint err = glGetError(); GLuint err = glGetError();
@ -571,9 +563,7 @@ mesh_factory::init_models(void)
} }
} }
void void mesh_factory::upload_models() {
mesh_factory::upload_models(void)
{
tms_infof("Uploading models..."); tms_infof("Uploading models...");
for (int x=0; x<NUM_MISC_MODELS; ++x) { for (int x=0; x<NUM_MISC_MODELS; ++x) {
@ -591,21 +581,14 @@ mesh_factory::upload_models(void)
/* dump models to cache file */ /* dump models to cache file */
if (!write_cache(&lb)) { if (!write_cache(&lb)) {
tms_errorf("An error occured while trying write model cache."); tms_errorf("An error occurred while trying to write model cache.");
} else { } else if (!save_cache(&lb)) {
if (!save_cache(&lb)) { tms_errorf("An error occurred while trying to save model cache to a file. (not enough permission/disk space?)");
tms_errorf("An error occured while trying to save model cache to a file. (not enough permission/disk space?)");
}
} }
} }
} }
int cur_mesh = 0; /* extern */ bool mesh_factory::load_next() {
/* Returns true if there are any more models to load */
bool
mesh_factory::load_next(void)
{
if (cur_mesh >= NUM_MODELS) return false; if (cur_mesh >= NUM_MODELS) return false;
struct model_load_data *mld = &mesh_factory::models[cur_mesh ++]; struct model_load_data *mld = &mesh_factory::models[cur_mesh ++];
@ -616,8 +599,8 @@ mesh_factory::load_next(void)
if (mld->path) { if (mld->path) {
mld->mesh = tms_model_load(model, mld->path, &status); mld->mesh = tms_model_load(model, mld->path, &status);
} else { } else {
/* If the base mesh model and the current chosen model are not the same, // If the base mesh model and the current chosen model are not the same,
* we will have to reload */ // we will have to reload
if (model != models[mld->base_id].model) { if (model != models[mld->base_id].model) {
cur_mesh = mld->base_id; cur_mesh = mld->base_id;
tms_warnf("Base mesh and shift-mesh model mismatch, reloading from base_mesh ID. (%d)", cur_mesh); tms_warnf("Base mesh and shift-mesh model mismatch, reloading from base_mesh ID. (%d)", cur_mesh);
@ -631,7 +614,7 @@ mesh_factory::load_next(void)
mld->model = model; mld->model = model;
if (model->vertices->size > 2000000) { if (model->vertices->size > 2000000) {
/* We exceeded 2 mil vertices with this mesh, load it again into another model */ // We exceeded 2 mil vertices with this mesh, load it again into another model
++ cur_model; ++ cur_model;
-- cur_mesh; -- cur_mesh;
} }

View file

@ -2,8 +2,6 @@
#include <tms/bindings/cpp/cpp.hh> #include <tms/bindings/cpp/cpp.hh>
extern int cur_mesh;
enum { enum {
MODEL_PLANK1, MODEL_PLANK1,
MODEL_PLANK2, MODEL_PLANK2,
@ -362,17 +360,31 @@ struct model_load_data {
struct tms_model *model; struct tms_model *model;
}; };
class mesh_factory class lvlbuf;
{
class mesh_factory {
private:
static char cache_path[512];
static bool use_cache;
static bool open_cache(lvlbuf *lb);
static bool read_cache(lvlbuf *lb);
static bool write_cache(lvlbuf *lb);
static bool save_cache(lvlbuf *lb);
public: public:
static struct model_load_data models[NUM_MODELS]; static struct model_load_data models[NUM_MODELS];
static int cur_mesh;
static inline struct tms_mesh *get_mesh(int model) static inline struct tms_mesh *get_mesh(int model) {
{
return mesh_factory::models[model].mesh; return mesh_factory::models[model].mesh;
} }
static void init_models(void); /// Initialise models, loading cached model data if it exists
static bool load_next(void); static void init_models();
static void upload_models(void);
/// Load the next model, return false if there are no more models to load
static bool load_next();
/// Upload all loaded models to the GPU
static void upload_models();
}; };