Skip to content
Snippets Groups Projects
bats.cpp 2.41 KiB
Newer Older
#include "bats.hpp"
#include "environment.hpp"
#include "key_positions_structure.hpp"
#include "interpolation.hpp"
#include "terrain.hpp"

void bats::initialize_bats()
{
	// Initialize the temporary mesh_drawable that will be inserted in the hierarchy
	mesh_drawable body;
	mesh_drawable wing1;
	mesh_drawable wing2;

	// Create the geometry of the meshes
	//   Note: this geometry must be set in their local coordinates with respect to their position in the hierarchy (and with respect to their animation)
	body.initialize_data_on_gpu(mesh_load_file_obj(project::path + "assets/bat/batbodyok.obj"));
	wing1.initialize_data_on_gpu(mesh_load_file_obj(project::path + "assets/bat/batwingleft.obj"));
	wing2.initialize_data_on_gpu(mesh_load_file_obj(project::path + "assets/bat/batwingright.obj"));

	// Scale the model
	//body.model.scaling = 0.2f;
	//wing1.model.scaling = 0.2f;
	//wing2.model.scaling = 0.2f;

	// Set the color of some elements
	body.material.color = { 1,1,1 };
	body.material.phong.specular = 0.0f;
	wing1.material.color = { 0.4f,0.4f,0.4f };
	wing1.material.phong.specular = 0.0f;
	wing2.material.color = { 0.4f,0.4f,0.4f };
	wing2.material.phong.specular = 0.0f;

	body.texture.load_and_initialize_texture_2d_on_gpu(project::path + "assets/bat/bat_texture.jpg",
		GL_REPEAT,
		GL_REPEAT);
	wing1.texture.load_and_initialize_texture_2d_on_gpu(project::path + "assets/bat/batw_texture.jpg",
		GL_REPEAT,
		GL_MIRRORED_REPEAT);
	wing2.texture.load_and_initialize_texture_2d_on_gpu(project::path + "assets/bat/batw_texture.jpg",
		GL_REPEAT,
		GL_MIRRORED_REPEAT);

	// Add the elements in the hierarchy
	//   The syntax is hierarchy.add(mesh_drawable, "name of the parent element", [optional: local translation in the hierarchy])
	//   Notes: 
	//     - An element must necessarily be added after its parent
	//     - The first element (without explicit name of its parent) is assumed to be the root.

	bat_mesh.add(body, "Bat base");
	bat_mesh.add(wing1, "Bat wing left1", "Bat base");
	bat_mesh.add(wing2, "Bat wing right1", "Bat base");

	N = 0;
}

void bats::update_mvt()
{
	for (int i = 0; i < N; i++) {
		bats_prop[i].update_mvt();
	}
}


void bats::add_bat(vec3 new_pos, float _size, numarray<vec3> key_positions, numarray<float> key_times) {
	N++;
	bats_prop.resize(N);

	bats_prop[N - 1].pos = new_pos;
	bats_prop[N - 1].isdead = false;
	bats_prop[N - 1].size = _size;
	bats_prop[N - 1].initialize_mvt(new_pos, key_positions, key_times);

}