3 #include "common/err_msg.h"
5 static void make_skycube(Scene *scene);
6 static void make_temple(Scene *scene);
7 static bool make_pillars(Scene *scene);
8 static void make_blobs(Scene *scene);
10 static void move_blobs(scalar_t t);
11 static scalar_t eval_func(const Vector3 &vec, scalar_t t);
12 static Vector3 eval_normals(const Vector3 &vec, scalar_t t);
14 static const int pillar_udiv = 16;
16 ParticleSysParams *pp[4];
21 static scalar_t bint[BLOB_COUNT] = {30, 28, 24, 15};
22 static Vector3 pos[BLOB_COUNT];
23 static ScalarField *sfield;
32 TemplePart::TemplePart() : ScenePart("temple", new Scene) {
34 TargetCamera *cam = new TargetCamera(Vector3(0, 52, 0), Vector3(0, 50, 0));
36 TargetCamera *cam = new TargetCamera(Vector3(0, 60, -160), Vector3(0, 50, 0));
38 cam->set_fov(DEG_TO_RAD(50));
39 scene->add_camera(cam);
43 lt = new PointLight(Vector3(-200, 250, -400));
44 lt->set_intensity(0.9);
47 lt = new PointLight(Vector3(200, 20, 0));
48 lt->set_intensity(0.6);
51 lt = new PointLight(Vector3(20, 500, -400));
52 lt->set_intensity(0.5);
55 scene->set_ambient_light(0.1);
68 MotionController ctrl;
71 ctrl = MotionController(CTRL_COS, TIME_FREE);
72 ctrl.set_sin_func(0.58, 250);
73 ctrl.set_control_axis(CTRL_X);
74 cam->add_controller(ctrl, CTRL_TRANSLATION);
76 ctrl = MotionController(CTRL_SIN, TIME_FREE);
77 ctrl.set_sin_func(1.17, 125);
78 ctrl.set_control_axis(CTRL_X);
79 cam->add_controller(ctrl, CTRL_TRANSLATION);
81 ctrl = MotionController(CTRL_SIN, TIME_FREE);
82 ctrl.set_sin_func(0.49, 220);
83 ctrl.set_control_axis(CTRL_Z);
84 cam->add_controller(ctrl, CTRL_TRANSLATION);
86 ctrl = MotionController(CTRL_COS, TIME_FREE);
87 ctrl.set_sin_func(0.99, 105);
88 ctrl.set_control_axis(CTRL_Z);
89 cam->add_controller(ctrl, CTRL_TRANSLATION);
91 ctrl = MotionController(CTRL_SIN, TIME_FREE);
92 ctrl.set_sin_func(0.45, 50);
93 ctrl.set_control_axis(CTRL_Y);
94 cam->add_controller(ctrl, CTRL_TRANSLATION);
97 greets = get_texture("data/img/greets.png");
99 scene->set_background(0.5);
101 // in order to precalculate the cubemaps...
104 //scene->render_sequence(0, 15000, 25);
108 TemplePart::~TemplePart() {}
110 static void make_skycube(Scene *scene) {
111 const float size = 5000;
115 face[0] = new ObjPlane(Vector3(0, -1, 0), Vector2(size, size), 0);
116 face[0]->translate(Vector3(0, size / 2, 0));
117 tex[0] = get_texture("data/img/py.jpg");
119 face[1] = new ObjPlane(Vector3(0, 1, 0), Vector2(size, size), 0);
120 face[1]->translate(Vector3(0, -size / 2, 0));
121 tex[1] = get_texture("data/img/ny.jpg");
123 face[2] = new ObjPlane(Vector3(0, 0, -1), Vector2(size, size), 0);
124 face[2]->translate(Vector3(0, 0, size / 2));
125 tex[2] = get_texture("data/img/pz.jpg");
127 face[3] = new ObjPlane(Vector3(0, 0, 1), Vector2(size, size), 0);
128 face[3]->translate(Vector3(0, 0, -size / 2));
129 tex[3] = get_texture("data/img/nz.jpg");
131 face[4] = new ObjPlane(Vector3(-1, 0, 0), Vector2(size, size), 0);
132 face[4]->translate(Vector3(size / 2, 0, 0));
133 tex[4] = get_texture("data/img/px.jpg");
135 face[5] = new ObjPlane(Vector3(1, 0, 0), Vector2(size, size), 0);
136 face[5]->translate(Vector3(-size / 2, 0, 0));
137 tex[5] = get_texture("data/img/nx.jpg");
139 for(int i=0; i<6; i++) {
140 Material *mat = face[i]->get_material_ptr();
141 mat->emissive_color = 1.0;
143 mat->set_texture(tex[i], TEXTYPE_DIFFUSE);
144 face[i]->set_texture_addressing(TEXADDR_CLAMP);
145 scene->add_object(face[i]);
149 void make_temple(Scene *scene) {
150 const Vector3 pillar_body[] = {
157 const Vector3 pillar_pos[] = {
158 Vector3(-50, 0, -50),
166 create_revolution(&pillar_mesh, pillar_body, 4, pillar_udiv, 10);
169 pillar_mat.specular_color = 1.0;
170 pillar_mat.specular_power = 70.0;
171 pillar_mat.set_texture(get_texture("data/img/benedeti.jpg"), TEXTYPE_DIFFUSE);
173 for(int i=0; i<4; i++) {
174 Object *obj = new Object;
175 obj->get_mesh() = pillar_mesh;
176 obj->set_position(pillar_pos[i]);
177 *obj->get_material_ptr() = pillar_mat;
178 scene->add_object(obj);
180 obj = new ObjCylinder(13.0, 5.0, true, pillar_udiv);
181 obj->set_position(pillar_pos[i] + Vector3(0, 6, 0));
182 *obj->get_material_ptr() = pillar_mat;
183 scene->add_object(obj);
185 obj = new ObjCylinder(16.0, 5.0, true, pillar_udiv);
186 obj->set_position(pillar_pos[i] + Vector3(0, 2, 0));
187 *obj->get_material_ptr() = pillar_mat;
188 scene->add_object(obj);
190 obj = new ObjTorus(2.0, 5.0);
191 obj->set_position(pillar_pos[i] + Vector3(0, 102, 0));
192 *obj->get_material_ptr() = pillar_mat;
193 scene->add_object(obj);
195 obj = new ObjTorus(2.0, 7);
196 obj->set_position(pillar_pos[i] + Vector3(0, 105, 0));
197 *obj->get_material_ptr() = pillar_mat;
198 scene->add_object(obj);
203 Object *obj = new ObjCylinder(95.0, 5, true, 25);
204 obj->set_position(Vector3(0, -2.5, 0));
205 obj->get_material_ptr()->set_texture(get_texture("data/img/brick1_base1.jpg"), TEXTYPE_DIFFUSE);
206 scene->add_object(obj);
208 obj = new ObjCylinder(103.0, 5, true, 25);
209 obj->set_position(Vector3(0, -7.5, 0));
210 obj->get_material_ptr()->set_texture(get_texture("data/img/brick1_base1.jpg"), TEXTYPE_DIFFUSE);
211 scene->add_object(obj);
214 const Vector3 ceil[] = {
232 create_revolution(obj->get_mesh_ptr(), ceil, 14, 24, 28);
233 obj->set_pivot(Vector3(0, 40, 0));
234 obj->set_position(Vector3(0, 110, 0));
235 obj->calculate_normals();
237 Texture *cubemap = new Texture(64, 64, TEX_CUBE);
238 add_texture(cubemap);
240 Material *mat = obj->get_material_ptr();
241 mat->diffuse_color = mat->ambient_color = int_color(239, 190, 37) * 0.8;
242 mat->specular_color = int_color(255, 198, 43);
243 mat->specular_power = 40.0;
244 mat->set_texture(get_texture("data/img/brick1_base1.jpg"), TEXTYPE_DIFFUSE);
245 mat->set_texture(cubemap, TEXTYPE_ENVMAP);
246 mat->auto_refl = false;
247 mat->env_intensity = 0.3;
248 scene->add_object(obj);
250 obj = new ObjCylinder(94, 5, true, 25);
251 obj->set_position(Vector3(0, 107.5, 0));
252 *obj->get_material_ptr() = *mat;
253 scene->add_object(obj);
256 const Vector3 sting[] = {
264 cubemap = new Texture(16, 16, TEX_CUBE);
265 add_texture(cubemap);
268 create_revolution(obj->get_mesh_ptr(), sting, 5, 10, 10);
269 obj->set_pivot(Vector3(0, 5, 0));
270 mat = obj->get_material_ptr();
271 mat->diffuse_color = mat->ambient_color = 0.1;
272 mat->specular_color = 1.0;
273 mat->specular_power = 80.0;
274 mat->set_texture(cubemap, TEXTYPE_ENVMAP);
275 mat->auto_refl = false;
276 scene->add_object(obj);
280 obj = new ObjPlane(Vector3(0, 1, 0), Vector2(1200, 1200), 6);
281 obj->set_position(Vector3(0, -10, 0));
282 mat = obj->get_material_ptr();
283 mat->set_texture(get_texture("data/img/mud.jpg"), TEXTYPE_DIFFUSE);
284 mat->tmat[TEXTYPE_DIFFUSE].set_scaling(Vector3(4.0, 4.0, 4.0));
285 scene->add_object(obj);
288 static bool make_pillars(Scene *scene) {
289 static const Vector3 ppos[] = {
290 Vector3(-150, -7.5, 0),
291 Vector3(0, -7.5, 150),
292 Vector3(150, -7.5, 0),
293 Vector3(0, -7.5, -150)
296 static const char *label_tex[] = {
297 "data/img/label_dolphin.png",
298 "data/img/label_duck.png",
299 "data/img/label_face.png",
300 "data/img/label_teapot.png",
304 Curve *curve = load_curve("data/pillar.curve");
306 for(int i=0; i<4; i++) {
308 sprintf(name, "pillar%02d", i);
310 Object *obj = new Object;
312 Material *mat = obj->get_material_ptr();
313 create_revolution(obj->get_mesh_ptr(), *curve, pillar_udiv, 10);
314 obj->set_scaling(Vector3(2.3, 1.8, 2.3));
316 obj->normalize_normals();
317 obj->set_position(ppos[i]);
319 mat->specular_color = 1.0;
320 mat->specular_power = 70.0;
321 mat->set_texture(get_texture("data/img/benedeti.jpg"), TEXTYPE_DIFFUSE);
322 scene->add_object(obj);
324 obj = new ObjCylinder(14.0, 3.0);
325 obj->set_position(ppos[i]);
326 mat = obj->get_material_ptr();
327 mat->specular_color = 1.0;
328 mat->specular_power = 70.0;
329 mat->set_texture(get_texture("data/img/benedeti.jpg"), TEXTYPE_DIFFUSE);
330 scene->add_object(obj);
333 Texture *cubemap = new Texture(64, 64, TEX_CUBE);
334 add_texture(cubemap);
340 Scene *scene = load_scene("data/geom/duck.3ds");
342 error("failed to load duck.3ds");
345 obj = scene->get_object("Object03");
347 scene->remove_object(obj);
350 obj->set_scaling(Vector3(0.009, 0.009, 0.009));
351 obj->set_auto_normalize(true);
353 obj->set_position(ppos[i] + Vector3(0, 50, 0));
354 obj->set_rotation(Vector3(0, quarter_pi, 0));
360 Scene *scene = load_scene("data/geom/chrmface.3ds");
362 error("failed to load chrmface.3ds");
365 obj = scene->get_object("0main01");
367 scene->remove_object(obj);
370 obj->set_scaling(Vector3(0.2, 0.2, 0.2));
371 obj->set_auto_normalize(true);
373 obj->set_position(ppos[i] + Vector3(4, 58, 0));
374 obj->set_rotation(Vector3(0, half_pi, 0));
376 obj->get_material_ptr()->two_sided = true;
382 Scene *scene = load_scene("data/geom/dolphin.3ds");
384 error("failed to load dolphin.3ds");
387 obj = scene->get_object("Loft01");
389 scene->remove_object(obj);
392 obj->set_scaling(Vector3(0.14, 0.14, 0.14));
393 obj->set_auto_normalize(true);
395 obj->set_position(ppos[i] + Vector3(0, 48, 0));
396 obj->set_rotation(Vector3(half_pi, half_pi, 0));
402 obj = new ObjTeapot(6.0);
403 obj->set_position(ppos[i] + Vector3(0, 43.7, 0));
407 mat = obj->get_material_ptr();
408 mat->diffuse_color = mat->ambient_color = 0.1;
409 mat->specular_color = 1.0;
410 mat->specular_power = 80.0;
411 mat->set_texture(cubemap, TEXTYPE_ENVMAP);
412 mat->auto_refl = false;
414 MotionController ctrl(CTRL_SIN, TIME_FREE);
415 ctrl.set_control_axis(CTRL_Y);
416 ctrl.set_sin_func(frand(0.5) + 2.3, 3.0, frand(pi));
417 obj->add_controller(ctrl, CTRL_TRANSLATION);
418 obj->translate(Vector3(0, 3.0, 0));
419 scene->add_object(obj);
421 ParticleSystem *label = new ParticleSystem("data/exibit.psys");
422 pp[i] = label->get_params();
423 pp[i]->halo = get_texture(label_tex[i]);
424 label->set_position(ppos[i] + Vector3(0, 80, 0));
425 scene->add_particle_sys(label);
427 ParticleSystem *trail = new ParticleSystem("data/test2.psys");
428 trail->set_position(ppos[i] + Vector3(0, 50, 0));
430 ctrl = MotionController(CTRL_SIN, TIME_FREE);
431 ctrl.set_control_axis(CTRL_X);
432 ctrl.set_sin_func(5.0, 30.0, (float)i * half_pi);
433 trail->add_controller(ctrl, CTRL_TRANSLATION);
435 ctrl = MotionController(CTRL_COS, TIME_FREE);
436 ctrl.set_control_axis(CTRL_Z);
437 ctrl.set_sin_func(5.0, 30.0, (float)i * half_pi);
438 trail->add_controller(ctrl, CTRL_TRANSLATION);
440 ctrl = MotionController(CTRL_SIN, TIME_FREE);
441 ctrl.set_control_axis(CTRL_Y);
442 ctrl.set_sin_func(1.8, 25.0, (float)i * half_pi);
443 trail->add_controller(ctrl, CTRL_TRANSLATION);
445 scene->add_particle_sys(trail);
452 #define MIN(a, b) ((a) < (b) ? (a) : (b))
453 #define MAX(a, b) ((a) > (b) ? (a) : (b))
455 void TemplePart::draw_part() {
456 static const float greets_time = 18.0;
457 float t = (float)time / 1000.0f;
460 float yoffs = MIN(150.0, t * 25.0);
461 for(int i=0; i<4; i++) {
462 pp[i]->spawn_offset = FuzzyVec3(0.0, yoffs, 0.0);
468 sfield->triangulate(blob->get_mesh_ptr(), 1.0, t, true);
473 if(t > greets_time) {
477 a2 = a2 > 0 ? -a2 : a2;
479 a2 *= frand(0.8) + 0.2;
481 float a1 = a2;//(cos(t)+1)/2;
482 a1 *= (sin(t / 2.0) > 0) ? 1.0 : 0.0; // modulate with step func
485 Color col(1.0, 1.0, 1.0, MAX(a2, a1) + 0.4);
487 set_matrix(XFORM_TEXTURE, Matrix4x4::identity_matrix);
488 load_xform_matrices();
490 for(int i=0; i<10; i++) {
491 set_alpha_blending(true);
492 set_blend_func(BLEND_SRC_ALPHA, BLEND_ONE);
493 float off = (float)i * 0.0025;
495 dsys::overlay(greets, Vector2(-off, -off), Vector2(1 + off, 1 + off), col, 0, false);
496 set_alpha_blending(false);
501 static void move_blobs(scalar_t t) {
502 Vector3 offs = Vector3(0, 2.75 * cos(t*1.5) + 2.25, 0);
503 pos[0] = offs + Vector3(sin(t), cos(t), 0) * 8.0;
504 pos[1] = offs + Vector3(sin(t*2) + cos(t*4)/2, sin(t*1.5), cos(t)) * 8.0;
505 pos[2] = offs + Vector3(cos(t*1.8)/2 + sin(t)/4, cos(t*2) + sin(t), sin(t*1.3)) * 8.0;
506 pos[3] = offs + Vector3(sin(t*1.2)/3 + cos(t*1.8)/3.5, sin(cos(t*2) + t)*1.5, cos(t*2.0)/2) * 7.0;
508 //cyl = Vector2(cos(t), sin(t*2.0)) * 8.0;
511 static scalar_t eval_func(const Vector3 &vec, scalar_t t) {
513 for(int i=0; i<BLOB_COUNT; i++) {
514 val += (bint[i] * 0.75) / (vec - pos[i]).length_sq();
520 //#define NORMAL_GRAD
521 static Vector3 eval_normals(const Vector3 &vec, scalar_t t) {
523 const scalar_t diff = 0.1;
526 grad.x = eval_func(vec + Vector3(diff, 0, 0), t) - eval_func(vec + Vector3(-diff, 0, 0), t);
527 grad.y = eval_func(vec + Vector3(0, diff, 0), t) - eval_func(vec + Vector3(0, -diff, 0), t);
528 grad.z = eval_func(vec + Vector3(0, 0, diff), t) - eval_func(vec + Vector3(0, 0, -diff), t);
530 return -grad.normalized();
532 Vector3 normal(0, 0, 0);
533 for(int i=0; i<BLOB_COUNT; i++) {
534 scalar_t len_sq = (vec - pos[i]).length_sq();
535 scalar_t len_quad = len_sq * len_sq;
536 normal += (vec - pos[i]) * 2.0 * bint[i] / len_quad;
539 return normal.normalized();
544 static void make_blobs(Scene *scene) {
547 const scalar_t field_size = 40.0;
548 const scalar_t hsz = field_size / 2.0;
550 sfield = new ScalarField(grid, Vector3(-hsz, -hsz, -hsz), Vector3(hsz, hsz, hsz));
551 sfield->set_evaluator(eval_func);
552 sfield->set_normal_evaluator(eval_normals);
555 Texture *cubemap = new Texture(64, 64, TEX_CUBE);
556 add_texture(cubemap);
560 blob->set_dynamic(true);
561 blob->set_position(Vector3(0, 50, 0));
562 blob->set_scaling(Vector3(2.8, 2.6, 2.8));
563 blob->set_auto_normalize(true);
565 Material *mat = blob->get_material_ptr();
566 mat->ambient_color = mat->diffuse_color = Color(0.7, 0.4, 0.2) * 0.4;
567 mat->specular_color = Color(0.9, 0.7, 0.6);
568 mat->specular_power = 60.0;
569 mat->set_texture(cubemap, TEXTYPE_ENVMAP);
570 mat->env_intensity = 0.6;
571 mat->auto_refl = false;
572 mat->two_sided = true;
574 scene->add_object(blob);