void draw(vec3d camera_position, vec3d light_position) { ALLEGRO_STATE previous_state; ALLEGRO_TRANSFORM transform; if (shader && shader_applies_transform) { // construct our entity's transform place.build_transform(&transform); // Now apply it to the shader shader->use(); Shader::set_vec3("camera_position", camera_position); Shader::set_vec3("light_position", light_position); Shader::set_mat4("position_transform", &transform); Shader::set_bool("reflecting", cube_map_reflecting); Shader::set_sampler("diffuse_texture", diffuse_texture, 2); Shader::set_sampler("specular_texture", specular_texture, 3); Shader::set_sampler("normal_texture", normal_texture, 4); Shader::set_sampler_cube("cube_map_A", cube_map_A, 5); Shader::set_sampler_cube("cube_map_B", cube_map_B, 6); } else { // when not using the shader, we'll need to // apply the transform directly here al_store_state(&previous_state, ALLEGRO_STATE_TRANSFORM); al_identity_transform(&transform); al_use_transform(&transform); place.start_transform(); // also, we set the texture on this model directly if (diffuse_texture) model->set_texture(diffuse_texture); } // actually draw our model here if (model) model->draw(); if (shader && shader_applies_transform) { Shader::stop(); } else { place.restore_transform(); al_restore_state(&previous_state); } }
virtual void draw() { if (!model) return; model->set_texture(texture); model->draw(); }