#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "scoReader.h"
#include "scoWriter.h"
void print_vector(vector_t *vector) {
printf("{%f, %f, %f}", vector->x, vector->y, vector->z);
}
void print_matrix(matrix_t *matrix) {
printf("[");
print_vector(&matrix->v0);
printf(", ");
print_vector(&matrix->v1);
printf(", ");
print_vector(&matrix->v2);
printf("] ");
print_vector(&matrix->o);
}
void print_mission_object(mission_object_t *mission_object)
{
printf("%s: meta_type = %d, sub_kind_no = %d, variation_id = %d, variation_id_2 = %d, position = ",
mission_object->id,
mission_object->meta_type,
mission_object->sub_kind_no,
mission_object->variation_id,
mission_object->variation_id_2);
print_matrix(&mission_object->position);
printf(", scale = ");
print_vector(&mission_object->scale);
}
void make_pie(mission_object_t *mission_objects, char *name, vector_t *origin, double radius, int n)
{
int lcv;
for(lcv = 0; lcv < n; ++lcv)
{
double angle = 2 * M_PI * lcv / n;
mission_objects[lcv].id = name;
mission_objects[lcv].meta_type = 0;
mission_objects[lcv].sub_kind_no = 743;
mission_objects[lcv].variation_id = 0;
mission_objects[lcv].variation_id_2 = 0;
mission_objects[lcv].position.v0.x = sin(angle);
mission_objects[lcv].position.v0.y = -cos(angle);
mission_objects[lcv].position.v0.z = 0;
mission_objects[lcv].position.v1.x = cos(angle);
mission_objects[lcv].position.v1.y = sin(angle);
mission_objects[lcv].position.v1.z = 0;
mission_objects[lcv].position.v2.x = 0;
mission_objects[lcv].position.v2.y = 0;
mission_objects[lcv].position.v2.z = 1;
mission_objects[lcv].position.o.x = radius * cos(angle) + origin->x;
mission_objects[lcv].position.o.y = radius * sin(angle) + origin->y;
mission_objects[lcv].position.o.z = origin->z;
mission_objects[lcv].scale.x = 1.8;
mission_objects[lcv].scale.y = 1;
mission_objects[lcv].scale.z = 1;
print_mission_object(&mission_objects[lcv]);
printf("\n");
}
}
int main(int argc, char **argv)
{
if(argc < 3)
{
printf("Usage: %s input heightmap output\n", argv[0]);
return EXIT_FAILURE;
}
FILE *in = fopen(argv[1], "rb");
FILE *out = fopen(argv[2], "wb");
if(!in || !out)
{
printf("ERROR: file(s) not found\n");
return EXIT_FAILURE;
}
printf("Reading %s\n", argv[1]);
sco_file_t sco_file;
read_sco_file(in, &sco_file);
int lcv;
for(lcv = 0; lcv < sco_file.num_mission_objects; ++lcv)
{
print_mission_object(&sco_file.mission_objects[lcv]);
printf("\n");
}
for(lcv = 0; lcv < 5; ++lcv)
{
int n = 32;
mission_object_t *more_mission_objects = (mission_object_t *)realloc(
sco_file.mission_objects,
(sco_file.num_mission_objects + n) * sizeof(mission_object_t));
if(more_mission_objects)
sco_file.mission_objects = more_mission_objects;
else
{
printf("ERROR: out of memory\n");
return EXIT_FAILURE;
}
vector_t origin;
origin.x = 310;
origin.y = 277;
origin.z = 9 * lcv + 33.23;
make_pie(&sco_file.mission_objects[sco_file.num_mission_objects], "spr_bridge_modular_a", &origin, 50, n);
sco_file.num_mission_objects += n;
}
printf("Writing %s\n", argv[2]);
write_sco_file(out, &sco_file);
return EXIT_SUCCESS;
}