Files
Swiftgram/submodules/RMIntro/Sources/core/animations.c
Kylmakalle fd86110711 Version 11.3.1
Fixes

fix localeWithStrings globally (#30)

Fix badge on zoomed devices. closes #9

Hide channel bottom panel closes #27

Another attempt to fix badge on some Zoomed devices

Force System Share sheet tg://sg/debug

fixes for device badge

New Crowdin updates (#34)

* New translations sglocalizable.strings (Chinese Traditional)

* New translations sglocalizable.strings (Chinese Simplified)

* New translations sglocalizable.strings (Chinese Traditional)

Fix input panel hidden on selection (#31)

* added if check for selectionState != nil

* same order of subnodes

Revert "Fix input panel hidden on selection (#31)"

This reverts commit e8a8bb1496.

Fix input panel for channels Closes #37

Quickly share links with system's share menu

force tabbar when editing

increase height for correct animation

New translations sglocalizable.strings (Ukrainian) (#38)

Hide Post Story button

Fix 10.15.1

Fix archive option for long-tap

Enable in-app Safari

Disable some unsupported purchases

disableDeleteChatSwipeOption + refactor restart alert

Hide bot in suggestions list

Fix merge v11.0

Fix exceptions for safari webview controller

New Crowdin updates (#47)

* New translations sglocalizable.strings (Romanian)

* New translations sglocalizable.strings (French)

* New translations sglocalizable.strings (Spanish)

* New translations sglocalizable.strings (Afrikaans)

* New translations sglocalizable.strings (Arabic)

* New translations sglocalizable.strings (Catalan)

* New translations sglocalizable.strings (Czech)

* New translations sglocalizable.strings (Danish)

* New translations sglocalizable.strings (German)

* New translations sglocalizable.strings (Greek)

* New translations sglocalizable.strings (Finnish)

* New translations sglocalizable.strings (Hebrew)

* New translations sglocalizable.strings (Hungarian)

* New translations sglocalizable.strings (Italian)

* New translations sglocalizable.strings (Japanese)

* New translations sglocalizable.strings (Korean)

* New translations sglocalizable.strings (Dutch)

* New translations sglocalizable.strings (Norwegian)

* New translations sglocalizable.strings (Polish)

* New translations sglocalizable.strings (Portuguese)

* New translations sglocalizable.strings (Serbian (Cyrillic))

* New translations sglocalizable.strings (Swedish)

* New translations sglocalizable.strings (Turkish)

* New translations sglocalizable.strings (Vietnamese)

* New translations sglocalizable.strings (Indonesian)

* New translations sglocalizable.strings (Hindi)

* New translations sglocalizable.strings (Uzbek)

New Crowdin updates (#49)

* New translations sglocalizable.strings (Arabic)

* New translations sglocalizable.strings (Arabic)

New translations sglocalizable.strings (Russian) (#51)

Call confirmation

WIP Settings search

Settings Search

Localize placeholder

Update AccountUtils.swift

mark mutual contact

Align back context action to left

New Crowdin updates (#54)

* New translations sglocalizable.strings (Chinese Simplified)

* New translations sglocalizable.strings (Chinese Traditional)

* New translations sglocalizable.strings (Ukrainian)

Independent Playground app for simulator

New translations sglocalizable.strings (Ukrainian) (#55)

Playground UIKit base and controllers

Inject SwiftUI view with overflow to AsyncDisplayKit

Launch Playgound project on simulator

Create .swiftformat

Move Playground to example

Update .swiftformat

Init SwiftUIViewController

wip

New translations sglocalizable.strings (Chinese Traditional) (#57)

Xcode 16 fixes

Fix

New translations sglocalizable.strings (Italian) (#59)

New translations sglocalizable.strings (Chinese Simplified) (#63)

Force disable CallKit integration due to missing NSE Entitlement

Fix merge

Fix whole chat translator

Sweetpad config

Bump version

11.3.1 fixes

Mutual contact placement fix

Disable Video PIP swipe

Update versions.json

Fix PIP crash
2024-12-20 09:38:13 +02:00

2574 lines
83 KiB
C

//
// animations.c
// IntroOpenGL
//
// Created by Ilya Rimchikov on 29/03/14.
// Copyright (c) 2014 IntroOpenGL. All rights reserved.
//
#include "animations.h"
#include "objects.h"
#include "linmath.h"
#include "math_helper.h"
#include "matrix.h"
#include "platform_gl.h"
#include "platform_log.h"
#include "rngs.h"
#include "timing.h"
#include <stdio.h>
static const vec4 black_color = {0,0,0, 1.0f};
static const vec4 white_color = {1,1,1, 1.0f};
/*
static const vec4 red_color = {1,0,0, 1.0f};
static const vec4 green_color = {0,1,0, 1.0f};
static const vec4 blue_color = {0,0,1, 1.0f};
*/
static LayerParams ribbonLayer, privateLayer;
static TexturedShape spiral;
static Shape mask1;
static Shape cloud_extra_mask1;
static Shape cloud_extra_mask2;
static Shape cloud_extra_mask3;
static Shape cloud_extra_mask4;
static Shape cloud_cover;
static Shape free_bg;
static TexturedShape fast_body;
static TexturedShape fast_arrow_shadow;
static TexturedShape fast_arrow;
static TexturedShape free_knot1;
static TexturedShape free_knot2;
static TexturedShape free_knot3;
static TexturedShape free_knot4;
static Shape powerful_bg;
static TexturedShape powerful_mask, powerful_infinity, powerful_infinity_white;
static Shape private_bg;
static TexturedShape telegram_sphere, telegram_plane;
static Shape cloud_bg;
#define starsCount 80
static TexturedShape star;
static Params stars[starsCount];
static TexturedShape test[6];
static Shape ribbon1;
static Shape ribbon2;
static Shape ribbon3;
static Shape ribbon4;
static mat4x4 stars_matrix;
static mat4x4 main_matrix;
static mat4x4 ribbons_layer;
static int test_texture[6];
static TexturedShape ic_bubble_dot, ic_bubble, ic_cam_lens, ic_cam, ic_pencil, ic_pin, ic_smile_eye, ic_smile, ic_videocam;
static int ic_bubble_dot_texture, ic_bubble_texture, ic_cam_lens_texture, ic_cam_texture, ic_pencil_texture, ic_pin_texture, ic_smile_eye_texture, ic_smile_texture, ic_videocam_texture;
static int telegram_sphere_texture, telegram_plane_texture;
static int fast_spiral_texture, fast_body_texture, fast_arrow_texture, fast_arrow_shadow_texture;
static int free_knot_up_texture, free_knot_down_texture;
static int powerful_mask_texture, powerful_star_texture, powerful_infinity_texture, powerful_infinity_white_texture;
static Shape infinity;
static int private_door_texture, private_screw_texture, private_keyhole_body_texture;
static TexturedShape private_door, private_screw, private_keyhole_body;
static Shape private_stroke;
static const float r1 = 58.5;
static const float r2 = 70;
static double ms0;
static int fps;
static double date, date0;
static int touch_x=0;
static double duration_const = .3;
static int direct;
static int frame_width;
static int i;
static int current_page, prev_page;
static double time;
static mat4x4 ic_matrix;
static LayerParams ic_pin_layer, ic_cam_layer, ic_videocam_layer, ic_smile_layer, ic_bubble_layer, ic_pencil_layer;
static float time_local = 0;
static int pagination_y, button_y;
static float knot_delays[4];
static float offset_y;
void set_page(int page)
{
/*
char str[15];
sprintf(str, "set_page>%d", page);
DEBUG_LOG_WRITE_D("fps>",str);
*/
if (current_page == page) {
return;
}
else
{
prev_page = current_page;
current_page = page;
//NSLog(@"_currentPage>%i", _currentPage);
//[self animate];
direct=current_page>prev_page?1:0;
//direct = (direct == 0) ? 1 : 0;
date0=date;
time = 0;//.5;//0.01;
}
}
void set_date(double a)
{
date=a;
}
void set_date0(double a)
{
direct = (direct == 0) ? 1 : 0;
date0=a;
}
void set_touch_x(int a)
{
touch_x = a;
}
void set_pages_textures(int a1, int a2, int a3, int a4, int a5, int a6)
{
test_texture[0]=a1;
test_texture[1]=a2;
test_texture[2]=a3;
test_texture[3]=a4;
test_texture[4]=a5;
test_texture[5]=a6;
}
void set_ic_textures(int a_ic_bubble_dot, int a_ic_bubble, int a_ic_cam_lens, int a_ic_cam, int a_ic_pencil, int a_ic_pin, int a_ic_smile_eye, int a_ic_smile, int a_ic_videocam)
{
ic_bubble_dot_texture = a_ic_bubble_dot;
ic_bubble_texture = a_ic_bubble;
ic_cam_lens_texture = a_ic_cam_lens;
ic_cam_texture = a_ic_cam;
ic_pencil_texture = a_ic_pencil;
ic_pin_texture = a_ic_pin;
ic_smile_eye_texture = a_ic_smile_eye;
ic_smile_texture = a_ic_smile;
ic_videocam_texture = a_ic_videocam;
}
void set_telegram_textures(int a_telegram_sphere, int a_telegram_plane)
{
telegram_sphere_texture = a_telegram_sphere;
telegram_plane_texture = a_telegram_plane;
}
void set_fast_textures(int a_fast_body, int a_fast_spiral, int a_fast_arrow, int a_fast_arrow_shadow)
{
fast_spiral_texture = a_fast_spiral;
fast_body_texture = a_fast_body;
fast_arrow_shadow_texture = a_fast_arrow_shadow;
fast_arrow_texture = a_fast_arrow;
}
void set_free_textures(int a_knot_up, int a_knot_down)
{
free_knot_up_texture = a_knot_up;
free_knot_down_texture = a_knot_down;
}
void set_powerful_textures(int a_powerful_mask, int a_powerful_star, int a_powerful_infinity, int a_powerful_infinity_white)
{
powerful_mask_texture = a_powerful_mask;
powerful_star_texture = a_powerful_star;
powerful_infinity_texture = a_powerful_infinity;
powerful_infinity_white_texture = a_powerful_infinity_white;
}
void set_private_textures(int a_private_door, int a_private_screw)
{
private_door_texture = a_private_door;
private_screw_texture = a_private_screw;
}
float t(float start_value, float end_value, float start_time, float duration, timing_type type)
{
if (time>start_time+duration) {
return end_value;
}
if (type==Linear) {
return start_value + (end_value - start_value)*MINf(duration+start_time, MAXf(.0, (time - start_time))) /duration;
}
return start_value + (end_value - start_value)*timing(MINf(duration+start_time, MAXf(.0, (time - start_time))) /duration, type);
}
float t_reversed(float end_value, float start_value, float start_time, float duration, timing_type type)
{
if (time>start_time+duration) {
return end_value;
}
if (type==Linear) {
return start_value + (end_value - start_value)*MINf(duration+start_time, MAXf(.0, (time - start_time))) /duration;
}
return start_value + (end_value - start_value)*timing(MINf(duration+start_time, MAXf(.0, (time - start_time))) /duration, type);
}
float t_local(float start_value, float end_value, float start_time, float duration, timing_type type)
{
if (type==Sin) {
return start_value + (end_value - start_value)*sin(MINf(MAXf((time_local - start_time)/duration * M_PI, 0), M_PI));
}
if (time_local>start_time+duration) {
return end_value;
}
if (type==Linear) {
return start_value + (end_value - start_value)*MINf(duration+start_time, MAXf(.0, (time_local - start_time))) /duration;
}
return start_value + (end_value - start_value)*timing(MINf(duration+start_time, MAXf(.0, (time_local - start_time))) /duration, type);
}
static int ribbonLength = 86;
static int starsFar=500;
static float scroll_offset;
void set_scroll_offset(float a_offset)
{
scroll_offset = a_offset;
}
static int star_order=0;
xyz star_create_position(float far)
{
starsFar = 1500;
int minR = 100;
int maxR = 1000;
star_order++;
if (star_order == 4) star_order = 0;
return xyzMake(signrand()*frand(minR, maxR), signrand()*frand(minR, maxR), far);
}
xyz star_initial_position(int randZ, int forward)
{
starsFar=1500;
int minR=100;
int maxR=1000;
float z = 0;
if (forward == 1) {
if (randZ == 0) {
z = -starsFar;
} else {
z = frand(0, -starsFar);
}
}
return xyzMake(signrand()*frand(minR, maxR), signrand()*frand(minR, maxR), z);
}
static int stars_rendered;
void inc_stars_rendered()
{
stars_rendered++;
}
static int tt;
void draw_stars()
{
/*
set_y_offset_objects(0);
star.params.scale = xyzMake(1000, 2, 1);
star.params.alpha = 1;
star.params.position = xyzMake(0,0,-1000);
draw_textured_shape(&star, stars_matrix, NORMAL);
star.params.scale = xyzMake(2, 1000, 1);
draw_textured_shape(&star, stars_matrix, NORMAL);
*/
//set_y_offset_objects(offset_y - 4*0);
//set_y_offset_objects(0);
//set_y_offset_objects(offset_y * (float)width/(float)height*0);
float k = (float)width/(float)height;
set_y_offset_objects(-100*k*0);
stars_rendered = 0;
for (i = 0; i < starsCount; i++)
{
float stars_scroll_offset = MAXf(0,scroll_offset)*2;
float transition_speed;
if (direct == 1) {
float s = 5;
transition_speed = s - t(0, s, 0, duration_const+1 +.8, Linear);
} else {
transition_speed = t(-4, 0, 0, duration_const+1, EaseOut);
}
float speed = stars_scroll_offset + transition_speed;
stars[i].position.z += speed;
if (stars[i].position.z>0 && speed>0) {
stars[i].position = star_initial_position(0, 1);
}
if (stars[i].position.z<-1500 && speed<0) {
stars[i].position = star_initial_position(0, 0);
}
float inc = scroll_offset*100;
stars[i].position.z = stars[i].position.z + inc;
star.params.position = stars[i].position;
float s = 1 + (-stars[i].position.z)/starsFar*5;
star.params.scale = xyzMake(s, s, 1);
float far = starsFar;
float k = 10.;
star.params.alpha = (1-(-stars[i].position.z)/far)*k;
star.params.alpha = star.params.alpha*star.params.alpha/k;
draw_textured_shape(&star, stars_matrix, NORMAL);
/*
star.params.scale = xyzMake(1000, 2, 1);
star.params.alpha = 1;
star.params.position = xyzMake(0,0,-1000);
draw_textured_shape(&star, stars_matrix, NORMAL);
star.params.scale = xyzMake(2, 1000, 1);
draw_textured_shape(&star, stars_matrix, NORMAL);
*/
stars[i].position.z = stars[i].position.z - inc;
}
set_y_offset_objects(offset_y);
}
void on_surface_created() {
setup_shaders();
mask1 = create_rounded_rectangle(CSizeMake(60, 60), 0, 16, black_color);
// MARK: Swiftgram
// Telegram
telegram_sphere = create_textured_rectangle(CSizeMake(150, 150), telegram_sphere_texture);
telegram_plane = create_textured_rectangle(CSizeMake(71, 103), telegram_plane_texture);
telegram_plane.params.anchor=xyzMake(0, 0, 0);
// Fast
fast_body = create_textured_rectangle(CSizeMake(148, 148), fast_body_texture);
fast_arrow_shadow = create_textured_rectangle(CSizeMake(164/2, 44/2), fast_arrow_shadow_texture);
fast_arrow_shadow.params.position.x=-1;
fast_arrow_shadow.params.position.y=2;
fast_arrow = create_textured_rectangle(CSizeMake(164/2, 44/2), fast_arrow_texture);
fast_arrow.params.anchor.x=fast_arrow_shadow.params.anchor.x=-19;
int ang = 180;
spiral = create_segmented_square(r1, D2R(35+1), D2R(35+1-10 + ang), fast_spiral_texture);
// Free
vec4 free_bg_color = {246/255., 73/255., 55/255., 1};
free_bg = create_rectangle(CSizeMake(160*2, 160*2), free_bg_color);
free_knot1 = create_textured_rectangle(CSizeMake(138/3, 138/3), free_knot_up_texture);
free_knot1.params.anchor.x = -23+10;
free_knot1.params.anchor.y = 23-10;
free_knot2 = create_textured_rectangle(CSizeMake(138/3, 138/3), free_knot_up_texture);
free_knot2.params.anchor.x = -23+10;
free_knot2.params.anchor.y = 23-10;
free_knot3 = create_textured_rectangle(CSizeMake(150/3, 150/3), free_knot_down_texture);
free_knot3.params.anchor.x = -100/4.+20/2.;
free_knot3.params.anchor.y = -100/4.+20/2.;
free_knot4 = create_textured_rectangle(CSizeMake(150/3, 150/3), free_knot_down_texture);
free_knot4.params.anchor.x = -100/4.+20/2.;
free_knot4.params.anchor.y = -100/4.+20/2.;
ribbonLayer = default_layer_params();
ribbon1 = create_ribbon(ribbonLength, white_color);
ribbon1.params.layer_params = &ribbonLayer;
ribbon2 = create_ribbon(ribbonLength, white_color);
ribbon2.params.rotation=90;
ribbon2.params.layer_params = &ribbonLayer;
ribbon3 = create_ribbon(ribbonLength, white_color);
ribbon3.params.rotation=180;
ribbon3.params.layer_params = &ribbonLayer;
ribbon4 = create_ribbon(ribbonLength, white_color);
ribbon4.params.rotation=270;
ribbon4.params.layer_params = &ribbonLayer;
ribbon1.params.position.y=ribbon2.params.position.y=ribbon3.params.position.y=ribbon4.params.position.y=-9;
ic_bubble_dot = create_textured_rectangle(CSizeMake(18/3, 18/3), ic_bubble_dot_texture);
ic_bubble = create_textured_rectangle(CSizeMake(102/3, 102/3), ic_bubble_texture);
ic_cam_lens = create_textured_rectangle(CSizeMake(36/3, 36/3), ic_cam_lens_texture);
ic_cam = create_textured_rectangle(CSizeMake(108/3, 96/3), ic_cam_texture);
ic_pencil = create_textured_rectangle(CSizeMake(86/3, 86/3), ic_pencil_texture);
ic_pin = create_textured_rectangle(CSizeMake(90/3, 120/3), ic_pin_texture);
ic_smile_eye = create_textured_rectangle(CSizeMake(18/3, 18/3), ic_smile_eye_texture);
ic_smile = create_textured_rectangle(CSizeMake(120/3, 120/3), ic_smile_texture);
ic_videocam = create_textured_rectangle(CSizeMake(144/3, 84/3), ic_videocam_texture);
ic_pin_layer = ic_cam_layer = ic_videocam_layer = ic_smile_layer = ic_bubble_layer = ic_pencil_layer = default_layer_params();
ic_pin_layer.anchor = xyzMake(0, 50/2, 0);
ic_pencil_layer.anchor = xyzMake(-30/2, 30/2, 0);
// Powerful
infinity = create_infinity(11.7, .0, 32, white_color);
vec4 powerful_bg_color = {47/255., 90/255., 131/255., 1};
powerful_bg = create_rectangle(CSizeMake(200, 200), powerful_bg_color);
powerful_mask = create_textured_rectangle(CSizeMake(200, 200), powerful_mask_texture);
powerful_infinity = create_textured_rectangle(CSizeMake(366/3, 180/3), powerful_infinity_texture);
powerful_infinity_white = create_textured_rectangle(CSizeMake(366/3, 180/3), powerful_infinity_white_texture);
float star_radius = 5.25;//4.5;
star = create_textured_rectangle(CSizeMake(star_radius, star_radius), powerful_star_texture);
star.params.const_params.is_star=1;
for (i=0; i<starsCount; i++) {
stars[i]=default_params();
stars[i].position = star_create_position(-(i*1500.)/starsCount);
//stars[i].const_params.is_star = 1;
}
// Private
privateLayer = default_layer_params();
vec4 private_bg_color = {200/255., 207/255., 212/255., 1};
private_bg = create_rectangle(CSizeMake(240, 240), private_bg_color);
private_door = create_textured_rectangle(CSizeMake(408/3, 408/3), private_door_texture);
private_keyhole_body = create_textured_rectangle(CSizeMake(216/3, 216/3), private_keyhole_body_texture);
private_screw = create_textured_rectangle(CSizeMake(30/3, 30/3), private_screw_texture);
private_stroke = create_rounded_rectangle_stroked(CSizeMake(244/2, 244/2), 21, 9, 16, white_color);
// Cloud-Based
int cloud_polygons_count = 64;
cloud_extra_mask1 = create_circle(1, cloud_polygons_count, black_color);
cloud_extra_mask2 = create_circle(1, cloud_polygons_count, black_color);
cloud_extra_mask3 = create_circle(1, cloud_polygons_count, black_color);
cloud_extra_mask4 = create_circle(1, cloud_polygons_count, black_color);
cloud_cover = create_rectangle(CSizeMake(240, 100), white_color);
cloud_cover.params.anchor.y = -50;
vec4 cloud_color = {42/255., 180/255., 247/255., 1};
cloud_bg = create_rectangle(CSizeMake(160*2, 160*2), cloud_color);
}
static inline void mat4x4_plain(mat4x4 M, int width, int height)
{
int i, j;
for(i=0; i<4; ++i)
for(j=0; j<4; ++j)
M[i][j] = 0.;
M[0][0]=1;
M[1][1]=1;
M[2][2]=1;
M[0][0]=1;
M[1][1]=(float)width/(float)height;
M[2][2]=1;
//for iphone retina width = 320
M[3][3]=(float)width/2.;
}
static inline void mat4x4_stars(mat4x4 m, float y_fov_in_degrees, float aspect, float n, float f, int width, int height)
{
int is_iOS = 1;
if (height >= width) {
float k = (float)width/(float)height;
float q = !is_iOS ? 1.4 : 0.7;
m[0][0] = 1.0f/q;
m[1][0] = 0.0f;
m[2][0] = 0.0f;
m[3][0] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = k/q;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 1.0f;
m[2][3] = -1.25;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = 0.0f;
m[3][3] = width*k;
}
else
{
float k = (float)height/(float)width;
float q = !is_iOS ? 2.0 : 0.7;
m[0][0] = 1.0f/q;
m[1][0] = 0.0f;
m[2][0] = 0.0f;
m[3][0] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = (1.0/k)/q;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 1.0f;
m[2][3] = -1.25;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = 0.0f;
m[3][3] = height*k;
}
mat4x4_translate_independed(m, 0, - 2*y_offset_absolute/(float)height + 4*scale_factor/(float)height, 0);
}
void on_surface_changed(int a_width_px, int a_height_px, float a_scale_factor, int a1, int a2, int a3, int a4, int a5)
{
glViewport(0, 0, a_width_px, a_height_px);
width = a_width_px/a_scale_factor;
height = a_height_px/a_scale_factor;
scale_factor = a_scale_factor;
offset_y = a1;
button_y = a3;
pagination_y = a4;
for (i = 0; i < 6; i++) {
test[i].params.position.y = a2;//170-18-4+10+12;
}
frame_width=a_width_px/a_scale_factor;
mat4x4_plain(main_matrix, (int)((float)a_width_px/a_scale_factor), (int)((float)a_height_px/a_scale_factor));
offset_y = a1*main_matrix[1][1];
set_y_offset_objects(offset_y);
y_offset_absolute = a1;
mat4x4_stars(stars_matrix, 45, 1, -1000, 0, (int)((float)a_width_px/a_scale_factor), (int)((float)a_height_px/a_scale_factor));
}
void rglNormalDraw()
{
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColorMask(1,1,1,1);
glDepthMask(0);
}
void rglMaskDraw()
{
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDepthMask(1);
glColorMask(0,0,0,0);
glDepthFunc(GL_GREATER);
glClearDepthf(0);
glClear(GL_DEPTH_BUFFER_BIT);
}
void rglNormalDrawThroughMask()
{
glColorMask(1,1,1,1);
glDepthFunc(GL_LESS);
glDepthMask(0);
}
void mat4x4_scaled(mat4x4 matrix, float s)
{
mat4x4_identity(matrix);
mat4x4_scale_aniso(matrix, matrix, s, s, s);
}
void mat4x4_layer(mat4x4 matrix, LayerParams params, float s, float r)
{
float a=main_matrix[1][1];
tt++;
mat4x4 model_matrix;
mat4x4_identity(model_matrix);
mat4x4 id;
mat4x4_identity(id);
float sc=main_matrix[3][3];
//printf("sc>%f\n", sc);
mat4x4_translate(model_matrix, -params.anchor.x/sc, params.anchor.y/sc*a, params.anchor.z/sc);
mat4x4 scaled;
mat4x4_identity(scaled);
float f=1;//.01;
mat4x4_scale_aniso(scaled, scaled, params.scale.x*f, params.scale.y*f, params.scale.z*f);
mat4x4 tmp;
mat4x4_dup(tmp, model_matrix);
mat4x4_mul(model_matrix, scaled, tmp);
mat4x4 rotate;
mat4x4_dup(rotate, id);
//mat4x4_translate(id, 0, 100./sc, 0);
mat4x4_rotate_Z2(rotate, id, -deg_to_radf(params.rotation) );
mat4x4_dup(tmp, model_matrix);
mat4x4_mul(model_matrix, rotate, tmp);
mat4x4_translate_independed(model_matrix, params.position.x/sc, -params.position.y/sc*a, params.position.z/sc);
//mat4x4_translate(model_matrix, params.position.x/sc, -params.position.y/sc*a - 100./sc*a, params.position.z/sc);
mat4x4 m;
mat4x4_mul(m, model_matrix, main_matrix);
//mat4x4_translate_independed(m, 0, +100*a, 0);
m[1][0]/=a;
m[0][1]*=a;
mat4x4 scale_m;
mat4x4_scaled(scale_m, s);
mat4x4_rotate_Z(scale_m, r);
scale_m[1][0]/=a;
scale_m[0][1]*=a;
mat4x4_mul(matrix, scale_m, m );
}
static float speedometer, calculated_speedometer_sin;
float speedometer_sin()
{
speedometer += scroll_offset*.1;
return sin(sin(time*1000*.15*0.08+speedometer)*M_PI)*5;
}
double ms0_anim, time_anim;
int fps_anim;
int count_anim_fps;
static float speedometer_scroll_offset=0, free_scroll_offset=0, private_scroll_offset=0;
double anim_pencil_stage_duration, anim_pencil_start_time, anim_pencil_start_all_time, anim_pencil_start_all_end_time;
int anim_pencil_stage;
int anim_bubble_dots_stage, anim_bubble_dots_q, anim_bubble_dots_count;
double anim_bubble_dots_next_time, anim_bubble_dots_duration;
int anim_bubble_dots_start_period, anim_bubble_dots_end_period;
double anim_videocam_start_time, anim_videocam_next_time, anim_videocam_duration, anim_videocam_angle, anim_videocam_old_angle;
double anim_cam_start_time, anim_cam_next_time, anim_cam_duration, anim_cam_angle, anim_cam_old_angle;
CPoint anim_cam_position, anim_cam_old_position;
int qShot;
int firstShot;
double anim_camshot_start_time, anim_camshot_next_time, anim_camshot_duration, anim_cambutton_start_time, anim_cambutton_end_time;
double anim_smile_start_time1, anim_smile_start_time2, anim_smile_blink_start_time;
int anim_smile_blink_one;
int anim_smile_stage;
static float scale;
double anim_pin_start_time, anim_pin_duration;
int anim_pin_start_period, anim_pin_end_period;
static int anim_pencil_period;
float pin_sin(float a)
{
if (a > M_PI*2*anim_pin_start_period && a < M_PI*2*anim_pin_end_period) {
return sin(a*.1);
}
if (a > M_PI*2*(anim_pin_end_period)) {
int p = 1;
anim_pin_start_period = anim_pin_end_period + p;
anim_pin_end_period = anim_pin_end_period + p + 1;
}
return 0;
}
float bubble_dots_sin(float a)
{
if (a < M_PI*2*anim_bubble_dots_end_period) {
return sin(a);
}
return 0;
}
float pencil_v_sin(float a)
{
return sin(a);
}
static mat4x4 private_matrix;
float cloud_scroll_offset, commonDelay;
static float ic_layer_scale=1, ic_layer_alpha=1;
static void reset_ic()
{
anim_smile_start_time1 = time_local;
anim_pencil_start_time = 0;
anim_pencil_start_all_end_time = 0;
anim_cam_next_time = time_local + 0;
anim_smile_stage = 0;
anim_smile_blink_one = 0;
anim_pencil_stage = 0;
anim_bubble_dots_end_period = 4;
anim_pencil_period = 1;
}
static void draw_ic(int type)
{
float rotation;
float beginTimeK;
float commonDelay;
float beginY = 250;
int bounce = 1;
texture_program_type COLOR, LIGHT_COLOR;
if (type == 0) {
beginTimeK = 2.;
commonDelay = duration_const*.5;
bounce = 1;
rotation = -D2R(free_scroll_offset);
cloud_scroll_offset = 0;
COLOR = RED, LIGHT_COLOR = LIGHT_RED;
} else {
rotation = 0;
beginTimeK = 2.5;
commonDelay = 0;
bounce = 1;
COLOR = BLUE, LIGHT_COLOR = LIGHT_BLUE;
}
float scale;
float t_y;
CPoint ic_pos;
ic_layer_alpha = 1;
if (current_page == 1 && direct == 0) {
ic_layer_alpha = t(1, 0, 0, duration_const*.25, EaseOut);
}
ic_pin.params.alpha = ic_layer_alpha;
ic_cam.params.alpha = ic_layer_alpha;
ic_cam_lens.params.alpha = ic_layer_alpha;
ic_smile.params.alpha = ic_layer_alpha;
ic_smile_eye.params.alpha = ic_layer_alpha;
ic_videocam.params.alpha = ic_layer_alpha;
ic_bubble.params.alpha = ic_layer_alpha;
ic_bubble_dot.params.alpha = ic_layer_alpha;
ic_pencil.params.alpha = ic_layer_alpha;
ic_layer_scale = 1;
if (current_page == 1 && direct == 0) {
// ic_layer_scale = t(1, 1.5, 0, duration_const, EaseOut);
// t_y = t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
if (type == 0) {
ic_pos = CPointMake(-106/2, 61/2);
if (current_page == 1 && direct == 0) {
t_y = 0;//t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
else
{
t_y = t(beginY, 0, commonDelay + duration_const*.2*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.2*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
//t_y = value;// + t(200, 0, commonDelay + duration_const*.2*beginTimeK, duration_const, EaseOut);
}
//t_y = t(200, 0, commonDelay + duration_const*.2*beginTimeK, duration_const, EaseOut);
}
else
{
ic_pos = CPointMake(-162/2+4, +26/2+20);
t_y = t(beginY, 0, commonDelay + duration_const*.2*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.2*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg-M_PI/8.) * .4;
t_y -= value*bounce;
}
float pink = 0;
if (time_local > anim_pin_start_time) {
pink = t_local(0, 1, anim_pin_start_time, anim_pin_duration, Sin);
if (time_local > anim_pin_start_time + anim_pin_duration) {
anim_pin_start_time = time_local + duration_const * frand(10, 20)*2;
anim_pin_duration = duration_const * frand(10, 20)*2;
}
}
float pinasin = 0;//sin(time_local*.1) * pink;
ic_pin_layer.position = xyzMake(ic_pos.x + cos(time_local*5)*3*pinasin + cloud_scroll_offset, ic_pos.y + sin(time_local*5)*1.5*pinasin + t_y , 0);
mat4x4_layer(ic_matrix, ic_pin_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_pin, ic_matrix, COLOR);
// videocam
if (type == 1) {
ic_videocam_layer.rotation = -30 + t_local(anim_videocam_old_angle, anim_videocam_angle, anim_videocam_start_time, anim_videocam_duration, EaseOut);
t_y = t(beginY, 0, commonDelay + duration_const*.45*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.45*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
if (t_y <= 1 && time_local > anim_videocam_next_time) {
anim_videocam_duration = duration_const*frand(1., 1.5)*1.5;
anim_videocam_old_angle = anim_videocam_angle;
anim_videocam_angle = 15 * irand(-1, 1);
anim_videocam_start_time = time_local;
anim_videocam_next_time = time_local + 1000000 + duration_const*frand(5, 8);
}
ic_videocam_layer.position = xyzMake(-68/2 + cloud_scroll_offset, +80/2 + t_y, 0);
mat4x4_layer(ic_matrix, ic_videocam_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_videocam, ic_matrix, COLOR);
}
// cam
if (type == 0) {
ic_pos = CPointMake(107/2, 78/2);
if (current_page == 1 && direct == 0) {
t_y = 0;
//t_y = t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
else
{
t_y = t(beginY, 0, commonDelay + duration_const*.3*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg=MAXf(0, time-(commonDelay + duration_const*.3*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
//t_y = t(200, 0, commonDelay + duration_const*.3*beginTimeK, duration_const, EaseOut);
}
else
{
ic_pos = CPointMake(-28/2, -20/2+2);
t_y = t(beginY, 0, commonDelay + duration_const*.15*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.15*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
if (t_y <= 1 && time_local > anim_cam_next_time) {
anim_cam_duration = duration_const*frand(1., 1.5);
anim_cam_old_angle = anim_cam_angle;
anim_cam_old_position = anim_cam_position;
anim_cam_start_time = time_local;
anim_cam_next_time = time_local + 10000000;//duration_const*frand(5, 8);
int r=irand(0, 1);
if (r == 0) {
anim_cam_position = CPointMake(-8+4, 0);
anim_cam_angle = signrand()*10;
}
else if (r == 1) {
anim_cam_position = CPointMake(4, -5);
anim_cam_angle = signrand()*10;
}
else if (r == 2) {
anim_cam_position = CPointMake(0, 0);
anim_cam_angle = 0;
}
qShot = irand(1, 2);
if (qShot <= 0) {
//anim_cam_next_time = MAXf;//time_local + duration_const*frand(5, 8);//frand(1, 2);
}
firstShot=1;
anim_camshot_start_time = time_local + duration_const * .5;//frand(1, 2)*5;
anim_camshot_duration = duration_const * .4;
}
ic_cam_layer.rotation = 15 + t_local(anim_cam_old_angle, anim_cam_angle, anim_cam_start_time, anim_cam_duration, EaseOut);
ic_cam_layer.position = xyzMake(
ic_pos.x + 0*t_local(anim_cam_old_position.x, anim_cam_position.x, anim_cam_start_time, anim_cam_duration, EaseOut) + cloud_scroll_offset,
ic_pos.y + 0*t_local(anim_cam_old_position.y, anim_cam_position.y, anim_cam_start_time, anim_cam_duration, EaseOut)
+ t_y,
0);
mat4x4_layer(ic_matrix, ic_cam_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_cam, ic_matrix, COLOR);
float lens_scale;
lens_scale = 1;
if (qShot >= 0 && time_local > anim_camshot_start_time) {
lens_scale = t_local(1, 0, anim_camshot_start_time, anim_camshot_duration, Sin);
if (time_local > anim_camshot_start_time + anim_camshot_duration) {
/*
if (qShot<=0) {
anim_cam_next_time = time_local + duration_const*frand(1, 2);
}
*/
qShot--;
anim_camshot_start_time = time_local + anim_camshot_duration;
}
}
ic_cam_lens.params.scale = xyzMake(lens_scale, lens_scale, 1);
ic_cam_lens.params.position = xyzMake(0, 1.7, 0);
draw_textured_shape(&ic_cam_lens, ic_matrix, COLOR);
// smile
if (type == 0) {
ic_pos = CPointMake(70/2, -116/2);
if (current_page == 1 && direct == 0) {
t_y = 0;
//t_y = t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
else
{
t_y = t(beginY, 0, commonDelay + duration_const*.0*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.0*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
//t_y = t(200, 0, commonDelay + duration_const*.0*beginTimeK, duration_const, EaseOut);
}
else
{
ic_pos = CPointMake(+60/2, 50/2);
t_y = t(beginY, 0, commonDelay + duration_const*.25*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.25*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg-M_PI/8.) * .4;
t_y -= value*bounce;
}
float smile_laught = 0;
float anim_smile_fade_duration = duration_const*2;
float anim_smile_duration = duration_const*2;
if (anim_smile_stage == 0) {
//printf("stage=0\n");
smile_laught = t_local(0, 1, anim_smile_start_time1, anim_smile_fade_duration, Linear);
if (time_local > anim_smile_duration*3 + anim_smile_start_time1) {
anim_smile_stage = 1;
anim_smile_start_time2 = time_local;// + anim_smile_fade_duration;
}
}
if (anim_smile_stage == 1) {
//printf("stage=1\n");
smile_laught = t_local(1, 0, anim_smile_start_time2, anim_smile_fade_duration, Linear);
if (time_local > anim_smile_duration + anim_smile_start_time2) {
smile_laught = 0;
anim_smile_stage = 2;//0;
//int zero_or = MAXf(0, irand(-2, 2));
//if (zero_or != 0 && irand(0, 10) >= 7) {
anim_smile_blink_one = 1;
anim_smile_blink_start_time = time_local + duration_const;
//}
//anim_smile_start_time1 = time_local + zero_or*frand(10, 20)*duration_const;
}
}
float y = 0;
if (anim_smile_stage < 2) {
y = sin(time_local*M_PI*10)*1.5*smile_laught;
}
ic_smile_layer.position = xyzMake(ic_pos.x + cloud_scroll_offset, y + ic_pos.y + t_y, 0);
mat4x4_layer(ic_matrix, ic_smile_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_smile, ic_matrix, COLOR);
if (time_local > anim_smile_blink_start_time+.1) {
float blink_pause = frand(3, 6);
if (irand(0, 3) == 0) {
blink_pause = .3;
}
if (anim_smile_blink_one == 1) {
blink_pause = frand(3, 6);
}
anim_smile_blink_start_time = time_local + blink_pause;
anim_smile_blink_one = 0;
}
int stop_time = 5;
float eye_scale = t_local(1, 0, anim_smile_blink_start_time, .1, Sin);
ic_smile_eye.params.scale = xyzMake(1, eye_scale, 1);
if (time > stop_time) ic_smile_eye.params.scale=xyzMake(1, 1, 1);
ic_smile_eye.params.position = xyzMake(-7, -4.5, 0);
draw_textured_shape(&ic_smile_eye, ic_matrix, COLOR);
if (anim_smile_blink_one == 1) ic_smile_eye.params.scale=xyzMake(1, 1, 1);
if (time > stop_time) ic_smile_eye.params.scale=xyzMake(1, 1, 1);
ic_smile_eye.params.position = xyzMake(7, -4.5, 0);
draw_textured_shape(&ic_smile_eye, ic_matrix, COLOR);
// bubble
if (type == 0) {
ic_pos = CPointMake(-60/2, 110/2);
if (current_page == 1 && direct == 0) {
t_y = 0;
//t_y = t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
else
{
t_y = t(beginY, 0, commonDelay + duration_const*.45*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg=MAXf(0, time-(commonDelay + duration_const*.45*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
//t_y = t(200, 0, commonDelay + duration_const*.4*beginTimeK, duration_const, EaseOut);
}
else
{
ic_pos = CPointMake(72/2, -74/2);
t_y = t(beginY, 0, commonDelay + duration_const*.0*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.0*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
ic_bubble_layer.position = xyzMake(ic_pos.x + cloud_scroll_offset, ic_pos.y + t_y, 0);
mat4x4_layer(ic_matrix, ic_bubble_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_bubble, ic_matrix, COLOR);
scale=.7 + 0.2*bubble_dots_sin(time*10);
ic_bubble_dot.params.scale = xyzMake(scale, scale, scale);
ic_bubble_dot.params.position = xyzMake(0-8.5, -9/2., 0);
draw_textured_shape(&ic_bubble_dot, ic_matrix, LIGHT_COLOR);
scale=.7 + 0.2*bubble_dots_sin(-M_PI*2/3 + time*10);
if (anim_bubble_dots_stage == 0) scale = MAXf(.7, scale);
ic_bubble_dot.params.scale = xyzMake(scale, scale, scale);
ic_bubble_dot.params.position = xyzMake(0, -9/2., 0);
draw_textured_shape(&ic_bubble_dot, ic_matrix, LIGHT_COLOR);
scale=.7 + 0.2*bubble_dots_sin(-M_PI*2/3*2 + time*10);
if (anim_bubble_dots_stage == 0) scale = MAXf(.7, scale);
ic_bubble_dot.params.scale = xyzMake(scale, scale, scale);
ic_bubble_dot.params.position = xyzMake(0+8.5, -9/2., 0);
draw_textured_shape(&ic_bubble_dot, ic_matrix, LIGHT_COLOR);
// pencil
float begin_k;
if (type == 0) {
ic_pos = CPointMake(-88/2-15, -100/2+13);
if (current_page == 1 && direct == 0) {
t_y = 0;
//t_y = t(0, -200, /*commonDelay + duration_const*(.5-.2)*beginTimeK*/0, duration_const, EaseOut);
}
else
{
begin_k=.1;
t_y = t(beginY, 0, commonDelay + duration_const*.1*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.1*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
//t_y = t(200, 0, commonDelay + duration_const*.1*beginTimeK, duration_const, EaseOut);
}
else
{
ic_pos = CPointMake(+152/2-17, +66/2+14);
begin_k = .4;
t_y = t(beginY, 0, commonDelay + duration_const*.35*beginTimeK, duration_const, EaseOut);
float value = 0;
float e = 2.71;
float arg = MAXf(0, time-(commonDelay + duration_const*.35*beginTimeK))*50;
value = beginY * pow(e, -0.055*arg * 2) * cos(0.08*arg) * .4;
t_y -= value*bounce;
}
float pencil_x = 0;
if (anim_pencil_stage == 0) {
ic_pencil_layer.rotation = t_local(0, -5, anim_pencil_start_all_time, duration_const*.5, EaseOut);
pencil_x = t_local(0, 14, anim_pencil_start_time, 1.5*0.85, Linear);
if (time_local > anim_pencil_start_time + 1.5*0.85) {
//printf("anim_pencil_stage==0\n");
anim_pencil_start_time = time_local;
anim_pencil_stage = 1;
}
}
else if (anim_pencil_stage == 1)
{
pencil_x = t_local(14, 0, anim_pencil_start_time, 1.5*0.15, Linear);
if (time_local > anim_pencil_start_time + 1.5*0.15) {
if (anim_pencil_period == 0) {
anim_pencil_start_all_end_time = time_local;
anim_pencil_start_time = time_local + duration_const*1;//frand(7, 10)*4;
anim_pencil_stage = 2;
//printf("anim_pencil_stage==1\nif-1\n");
}
else
{
anim_pencil_period--;
//printf("anim_pencil_stage==1\nif-2\n");
anim_pencil_start_time = time_local;
anim_pencil_stage = 0;
}
}
}
else if (anim_pencil_stage == 2)
{
ic_pencil_layer.rotation = t_local(-5, 0, anim_pencil_start_all_end_time, duration_const*.5, EaseOut);
if (time_local > anim_pencil_start_time) {
//printf("anim_pencil_stage==3\n");
anim_pencil_start_all_time = time_local;
anim_pencil_start_time=time_local;
anim_pencil_stage = 3;
//printf("anim_pencil_start_time>%f", anim_pencil_start_time);
//anim_pencil_stage=0;
}
}
float pencil_v = (anim_pencil_stage < 2 ) ? pencil_v_sin(time_local*2*M_PI*4)*.8 : 0;
ic_pencil_layer.position = xyzMake(pencil_x + ic_pos.x + cloud_scroll_offset, pencil_v + ic_pos.y + t_y, 0);
mat4x4_layer(ic_matrix, ic_pencil_layer, ic_layer_scale, rotation);
draw_textured_shape(&ic_pencil, ic_matrix, COLOR);
}
int anim_safe_button_i, anim_safe_button_j, anim_safe_button_q = 0;
float anim_safe_button_start_time, anim_safe_shake_start_time, anim_safe_shake_duration;
void draw_safe(int type, float alpha, float screw_alpha)
{
float screw_distance = 53;
float dk = .1;
float k = dk * 0;
private_screw.params.alpha = alpha * screw_alpha;
scale = 1;//t(.0, 1., common_delay+duration_const*k, duration_const*durk, EaseOut);
private_screw.params.scale = xyzMake(scale,scale,1);
private_screw.params.position = xyzMake(-screw_distance, -screw_distance, 0);
draw_textured_shape(&private_screw, private_matrix, NORMAL_ONE);
k = dk * 1;
scale = 1;//t(.0, 1., common_delay+duration_const*k, duration_const*durk, EaseOut);
private_screw.params.scale = xyzMake(scale,scale,1);
private_screw.params.position = xyzMake(screw_distance, -screw_distance, 0);
draw_textured_shape(&private_screw, private_matrix, NORMAL_ONE);
k = dk * 2;
scale = 1;//t(.0, 1., common_delay+duration_const*k, duration_const*durk, EaseOut);
private_screw.params.scale = xyzMake(scale,scale,1);
private_screw.params.position = xyzMake(-screw_distance, screw_distance, 0);
draw_textured_shape(&private_screw, private_matrix, NORMAL_ONE);
k = dk * 3;
scale = 1;//t(.0, 1., common_delay+duration_const*k, duration_const*durk, EaseOut);
private_screw.params.scale = xyzMake(scale,scale,1);
private_screw.params.position = xyzMake(screw_distance, screw_distance, 0);
draw_textured_shape(&private_screw, private_matrix, NORMAL_ONE);
}
static float backgroundColor[3] = {1.0, 1.0, 1.0};
void set_intro_background_color(float r, float g, float b) {
backgroundColor[0] = r;
backgroundColor[1] = g;
backgroundColor[2] = b;
}
void on_draw_frame() {
time_local += .016;
if (current_page != prev_page) {
reset_ic();
ms0_anim=date;
fps_anim=0;
count_anim_fps=1;
}
float knotDelayStep = .075;
if (prev_page != current_page) {
for (i = 0; i < 4; i++) {
knot_delays[i]=(.65+knotDelayStep*i)*duration_const;
}
for (i = 0; i < 10; i++) {
int j1 = irand(0, 3);
int j2 = irand(0, 3);
float temp = knot_delays[j1];
knot_delays[j1] = knot_delays[j2];
knot_delays[j2] = temp;
}
if (current_page == 2) {
ic_pin_layer.rotation = -15;
ic_cam_layer.rotation = 15;
ic_smile_layer.rotation = -15;
ic_bubble_layer.rotation = -15;
}
if (current_page == 4) {
anim_safe_button_q = 21;
anim_safe_button_i = 2;
anim_safe_button_j = 3;
anim_safe_button_start_time = time_local + 1.5;
}
if (current_page == 5) {
ic_pin_layer.rotation = -15;
ic_videocam_layer.rotation = -30;
ic_cam_layer.rotation = 15;
ic_smile_layer.rotation = -15;
ic_bubble_layer.rotation = -15;
}
}
fps_anim++;
if (count_anim_fps == 1 && date-ms0_anim >= duration_const) {
/*
char str[15];
sprintf(str, "anim>%d", fps_anim);
DEBUG_LOG_WRITE_D("fps>",str);
*/
count_anim_fps=0;
}
fps++;
if (date-ms0 >= 1.) {
/*
char str[15];
sprintf(str, "%d", fps);
DEBUG_LOG_WRITE_D("fps",str);
*/
ms0=date;
fps=0;
}
time = date - date0;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
float private_back_k = .8;
glClearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);
glClear(GL_COLOR_BUFFER_BIT);
/*
rglNormalDraw();
telegram_sphere.params.alpha = 1;
//telegram_sphere.params.position.y = -offset_y;
draw_textured_shape(&telegram_sphere, main_matrix, NORMAL);
draw_stars();
*/
//return;
// LAYER0 - PREPARATION ///// ///// ///// ///// ///// ///// ///// /////
if (current_page == 0)
{
rglNormalDraw();
telegram_sphere.params.alpha = 1;
scale = 1;
float alpha = 1;
if (direct == 0) {
alpha = t(0, 1, 0, duration_const, Linear);
scale = 1;
fast_body.params.alpha = 1;
fast_body.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&fast_body, main_matrix, NORMAL);
}
telegram_sphere.params.alpha = alpha;
telegram_sphere.params.scale = xyzMake(scale, scale, 1);
telegram_plane.params.alpha=1;
float tt = MINf(0, -M_PI*125./180. + time * M_PI * 2 * 1.5);
float dx = sin(tt)*75;
float dy = -sin(tt)*60;
telegram_plane.params.position = xyzMake(dx, dy, 0);
float scale = (cos(tt)+1)*.5;
telegram_plane.params.scale = xyzMake(cos(tt)*scale, scale, 1);
if (tt < D2R(125)) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
}
else if (current_page == 1)
{
rglNormalDraw();
if (direct == 1) {
fast_body.params.scale = xyzMake(1, 1, 1);
fast_body.params.alpha = 1;
draw_textured_shape(&fast_body, main_matrix, NORMAL);
} else {
fast_body.params.alpha = t(0, 1, .0, duration_const, Linear);;
float scale = t(.95, 1, 0, duration_const, EaseInEaseOut);
fast_body.params.scale = xyzMake(scale, scale, 1.);
draw_textured_shape(&fast_body, main_matrix, NORMAL);
}
}
else if (current_page == 2)
{
rglNormalDraw();
if (direct == 1) {
fast_body.params.alpha = t(1., .0, .0, duration_const, Linear);;
float scale = t(1, .95, 0, duration_const, EaseInEaseOut);
fast_body.params.scale = xyzMake(scale, scale, 1.);
draw_textured_shape(&fast_body, main_matrix, NORMAL);
}
}
else if (current_page == 4)
{
if (direct == 1) {
privateLayer.rotation=private_scroll_offset + t(-90, 0, 0, duration_const, EaseOut);
} else {
privateLayer.rotation=private_scroll_offset + t(90, 0, 0, duration_const*private_back_k, EaseOut);
}
mat4x4_layer(private_matrix, privateLayer, 1., 0);
}
// LAYER1 - MASK ///// ///// ///// ///// ///// ///// ///// /////
rglMaskDraw();
mask1.params.position.z = cloud_extra_mask1.params.position.z = cloud_extra_mask2.params.position.z = cloud_extra_mask3.params.position.z = cloud_extra_mask4.params.position.z = 1;
if (current_page == 0)
{
if (direct == 0) {
change_rounded_rectangle(&mask1, CSizeMake(r1*2, r1*2), r1);
mask1.params.rotation = 0;
}
}
else if (current_page == 1)
{
if (direct == 1) {
change_rounded_rectangle(&mask1, CSizeMake(r1*2, r1*2), r1);
mask1.params.rotation = 0;
} else {
float size = t(r2*2, r1*2, 0, duration_const, EaseInEaseOut);
float round = t(30, r1, 0, duration_const, EaseInEaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round);
free_scroll_offset = 0;
mask1.params.rotation=t(180, 0., 0, duration_const, EaseInEaseOut) + free_scroll_offset;
}
}
else if (current_page == 2)
{
if (direct==1) {
float size = t(r1*2, r2*2, 0, duration_const, EaseInEaseOut);
float round = t(r1, 30, 0, duration_const, EaseInEaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round);
free_scroll_offset = scroll_offset*5;
mask1.params.rotation=t(0, 180., 0, duration_const, EaseInEaseOut) + free_scroll_offset;
}
else
{
free_scroll_offset = scroll_offset*5;
float r=316/4.;
float size = t_reversed(r2*2, r*2, 0, duration_const, EaseInEaseOut);
float round = t_reversed(30, 20, 0, duration_const, EaseInEaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round);
mask1.params.rotation=t_reversed(180.+free_scroll_offset, 180.+90., 0, duration_const, EaseInEaseOut);
}
}
else if (current_page == 3)
{
if (direct == 1) {
float r = 316/4.;
float size = t(r2*2, r*2, 0, duration_const, EaseInEaseOut);
float round = t(30, 20, 0, duration_const, EaseInEaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round);
mask1.params.rotation = t(180.+free_scroll_offset, 180.+90., 0, duration_const, EaseInEaseOut);
} else {
float r = 316/4.;
float size = t_reversed(r*2, r2*2, 0, duration_const, EaseOut);
float round = t_reversed(20, 30, 0, duration_const, EaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round );
mask1.params.rotation = t_reversed(180.+90., 180.+90.+90., 0, duration_const, EaseOut);
mask1.params.position = xyzMake(0,0,mask1.params.position.z);
}
}
else if (current_page == 4)
{
if (direct == 1) {
float r=316/4.;
float size = t(r*2, r2*2, 0, duration_const, EaseOut);
float round = t(20, 30, 0, duration_const, EaseOut);
change_rounded_rectangle(&mask1, CSizeMake(size, size), round );
mask1.params.rotation=private_scroll_offset + t(180.+90., 180.+90.+90., 0, duration_const, EaseOut);
mask1.params.position = xyzMake(0,0,mask1.params.position.z);
} else {
float k = 0;
k=1.*private_back_k;
float scale = t_reversed(r2*2, 100, 0, duration_const*k, EaseOut);
change_rounded_rectangle(&mask1, CSizeMake(scale, scale), t_reversed(30, 50, 0, duration_const*k, EaseOut));
mask1.params.position = xyzMake( t_reversed(0, 29/2, 0, duration_const*k, EaseOut), t_reversed(0, -19/2, 0, duration_const*k, EaseOut), mask1.params.position.z);
mask1.params.rotation=private_scroll_offset + t_reversed(180.+90.+90., 180.+90.+90.+90., 0, duration_const*k, EaseOut);
k=1.*private_back_k;
int sublayer2_radius = 33;
cloud_extra_mask1.params.position = xyzMake( t_reversed(0, -122/2, 0, duration_const*k, EaseOut), t_reversed(0, 54/2-1, 0, duration_const*k, EaseOut), cloud_extra_mask1.params.position.z);
scale = t_reversed(0, sublayer2_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask1.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask1, main_matrix);
k = 1.15*private_back_k;
int sublayer3_radius = 94/4;
cloud_extra_mask2.params.position = xyzMake( t_reversed(0, -84/2, 0, duration_const*k, EaseOut), t_reversed(0, -29/2, 0, duration_const*k, EaseOut), cloud_extra_mask2.params.position.z);
scale = t_reversed(0, sublayer3_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask2.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask2, main_matrix);
k=1.3*private_back_k;
int sublayer4_radius = 124/4;
cloud_extra_mask3.params.position = xyzMake( t_reversed(0, 128/2, 0, duration_const*k, EaseOut), t_reversed(0, 56/2, 0, duration_const*k, EaseOut), cloud_extra_mask3.params.position.z);
scale = t_reversed(0, sublayer4_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask3.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask3, main_matrix);
k=1.5*private_back_k;
int sublayer5_radius = 64;
cloud_extra_mask4.params.position = xyzMake( t_reversed(0, 0, 0, duration_const*k, EaseOut), t_reversed(0, 50, 0, duration_const*k, EaseOut), cloud_extra_mask4.params.position.z);
scale = t_reversed(0, sublayer5_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask4.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask4, main_matrix);
}
}
else if (current_page == 5)
{
float k = 0;
k = 0.8;
float scale = t(r2*2, 100, 0, duration_const*k, EaseOut);
change_rounded_rectangle(&mask1, CSizeMake(scale, scale), t(30, 50, 0, duration_const*k, EaseOut));
mask1.params.position = xyzMake( t(0, 29/2, 0, duration_const*k, EaseOut), t(0, -19/2, 0, duration_const*k, EaseOut), mask1.params.position.z);
mask1.params.rotation = t(180.+90.+90., 180.+90.+90.+90., 0, duration_const*k, EaseOut);
k = 1.;
int sublayer2_radius = 33;
cloud_extra_mask1.params.position = xyzMake( t(0, -122/2, 0, duration_const*k, EaseOut), t(0, 54/2-1, 0, duration_const*k, EaseOut), cloud_extra_mask1.params.position.z);
scale = t(0, sublayer2_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask1.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask1, main_matrix);
k = 1.15;
int sublayer3_radius = 94/4;
cloud_extra_mask2.params.position = xyzMake( t(0, -84/2, 0, duration_const*k, EaseOut), t(0, -29/2, 0, duration_const*k, EaseOut), cloud_extra_mask2.params.position.z);
scale = t(0, sublayer3_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask2.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask2, main_matrix);
k = 1.3;
int sublayer4_radius = 124/4;
cloud_extra_mask3.params.position = xyzMake( t(0, 128/2, 0, duration_const*k, EaseOut), t(0, 56/2, 0, duration_const*k, EaseOut), cloud_extra_mask3.params.position.z);
scale = t(0, sublayer4_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask3.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask3, main_matrix);
k = 1.5;
int sublayer5_radius = 64;
cloud_extra_mask4.params.position = xyzMake( t(0, 0, 0, duration_const*k, EaseOut), t(0, 50, 0, duration_const*k, EaseOut), cloud_extra_mask4.params.position.z);
scale = t(0, sublayer5_radius, 0, duration_const*k, EaseOut);
cloud_extra_mask4.params.scale = xyzMake(scale, scale,1);
draw_shape(&cloud_extra_mask4, main_matrix);
}
draw_shape(&mask1, main_matrix);
// LAYER3 - THROUGH MASK ///// ///// ///// ///// ///// ///// ///// /////
int rr = 30;
int seg = 15;
int ang = 180;
rglNormalDrawThroughMask();
if (current_page == 0)
{
if (direct == 0) {
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
change_segmented_square(&spiral, r1, D2R(rr+seg), D2R(speedometer_scroll_offset + calculated_speedometer_sin + t(-seg+ang, 0, 0, duration_const, EaseOut)));
spiral.params.scale = xyzMake(1, 1, 1);
spiral.params.rotation = t(180., 0, 0, duration_const, EaseOut);
spiral.params.alpha = t(1,0,0,duration_const,Linear);
draw_textured_shape(&spiral, main_matrix, NORMAL_ONE);
fast_arrow.params.alpha = fast_arrow_shadow.params.alpha = t(1,0,0,duration_const,Linear);
fast_arrow.params.rotation = fast_arrow_shadow.params.rotation = t(rr, rr-180-160, 0, duration_const, EaseOut) + speedometer_scroll_offset + calculated_speedometer_sin;
draw_textured_shape(&fast_arrow_shadow, main_matrix, NORMAL_ONE);
draw_textured_shape(&fast_arrow, main_matrix, NORMAL_ONE);
}
}
else if (current_page == 1)
{
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
speedometer_scroll_offset = scroll_offset * 25;
calculated_speedometer_sin = 0;
if (direct == 1) {
float value = 0;
float e = 2.71;
float arg = time * 50;
value = 180 - 180 * pow(e, -0.055*arg * 2) * cos(0.08*arg*3);
float ta = t(0, 180., 0, duration_const, EaseOut);
change_segmented_square(&spiral, r1, D2R(rr+seg), D2R(-seg + value + speedometer_scroll_offset));
spiral.params.scale = xyzMake(1, 1, 1);
spiral.params.rotation = ta;
spiral.params.alpha = t(0, 1, 0, duration_const, Linear);
draw_textured_shape(&spiral, main_matrix, NORMAL_ONE);
fast_arrow.params.alpha = fast_arrow_shadow.params.alpha = t(0, 1, 0, duration_const, Linear);
fast_arrow.params.rotation = fast_arrow_shadow.params.rotation = -330 + value + ta + speedometer_scroll_offset;
draw_textured_shape(&fast_arrow_shadow, main_matrix, NORMAL_ONE);
draw_textured_shape(&fast_arrow, main_matrix, NORMAL_ONE);
} else {
spiral.params.alpha = fast_arrow.params.alpha = fast_arrow_shadow.params.alpha = 1;
float value = 0;
float e = 2.71;
float arg = time*50;
float dangle = 90;
value = 180 - 90 - (180-90) * pow(e, -0.055*arg * 2) * cos(0.08*arg*3);
value *= -1;
change_segmented_square(&spiral, r1, D2R(rr+seg), D2R(speedometer_scroll_offset + value + calculated_speedometer_sin + t( 360, 360-dangle-seg, 0, duration_const, EaseInEaseOut)));
float scale = t(1.18, 1, 0, duration_const, EaseInEaseOut);
spiral.params.scale = xyzMake(scale, scale, 1);
spiral.params.rotation = t(360, 180, 0, duration_const, EaseInEaseOut);
draw_textured_shape(&spiral, main_matrix, NORMAL);
fast_arrow.params.rotation = fast_arrow_shadow.params.rotation = speedometer_scroll_offset + value + calculated_speedometer_sin + t(rr+360+6, rr+360-180-dangle, 0, duration_const, EaseInEaseOut);
draw_textured_shape(&fast_arrow_shadow, main_matrix, NORMAL);
draw_textured_shape(&fast_arrow, main_matrix, NORMAL);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
free_bg.params.alpha = t(1, 0, 0, duration_const, Linear);
draw_shape(&free_bg, main_matrix);
draw_ic(0);
}
}
else if (current_page == 2) {
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
if (direct == 1) {
spiral.params.alpha = fast_arrow.params.alpha = fast_arrow_shadow.params.alpha = 1;
int ang = 180;
change_segmented_square(&spiral, r1, D2R(rr+seg+speedometer_scroll_offset), D2R(t(-seg+ang, 360, 0, duration_const, EaseInEaseOut)));
float scale = t(1, 1.18, 0, duration_const, EaseInEaseOut);
spiral.params.scale = xyzMake(scale, scale, 1);
spiral.params.rotation = t(180, 360, 0, duration_const, EaseInEaseOut);
draw_textured_shape(&spiral, main_matrix, NORMAL);
fast_arrow.params.rotation = fast_arrow_shadow.params.rotation = speedometer_scroll_offset + t(rr, rr+360+6, 0, duration_const, EaseInEaseOut);
draw_textured_shape(&fast_arrow_shadow, main_matrix, NORMAL);
draw_textured_shape(&fast_arrow, main_matrix, NORMAL);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
free_bg.params.alpha = t(0, 1, 0, duration_const, Linear);
draw_shape(&free_bg, main_matrix);
draw_ic(0);
}
else
{
glDisable(GL_BLEND);
free_bg.params.alpha = 1;
draw_shape(&free_bg, main_matrix);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
draw_ic(0);
powerful_bg.params.alpha = t_reversed(0, 1, 0, duration_const, Linear);
draw_shape(&powerful_bg, main_matrix);
}
//back
ribbon1.params.rotation = 0;
ribbon2.params.rotation = 90;
ribbon3.params.rotation = 180;
ribbon4.params.rotation = 270;
}
else if (current_page == 3) {
if (direct == 1) {
glDisable(GL_BLEND);
free_bg.params.alpha = 1;
draw_shape(&free_bg, main_matrix);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
powerful_bg.params.alpha = t(0, 1, 0, duration_const, Linear);
draw_shape(&powerful_bg, main_matrix);
draw_stars();
} else {
glDisable(GL_BLEND);
private_bg.params.alpha = 1;
draw_shape(&private_bg, main_matrix);
float a = t(0, 1., 0, duration_const, EaseOut);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
powerful_bg.params.rotation = 0;
powerful_bg.params.alpha = a;
draw_shape(&powerful_bg, main_matrix);
draw_stars();
}
}
else if (current_page == 4)
{
if (direct == 1) {
glDisable(GL_BLEND);
powerful_bg.params.alpha = 1;
draw_shape(&powerful_bg, main_matrix);
float a = t(0, 1., 0, duration_const, EaseOut);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
private_bg.params.rotation = t(45, 0, 0, duration_const, EaseOut);
private_bg.params.alpha = a;
draw_shape(&private_bg, main_matrix);
} else {
glDisable(GL_BLEND);
cloud_bg.params.alpha = 1;
draw_shape(&cloud_bg, main_matrix);
float a = t(0, 1., 0, duration_const*private_back_k, EaseOut);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
private_bg.params.alpha = a;
draw_shape(&private_bg, main_matrix);
}
}
else if (current_page == 5)
{
glDisable(GL_BLEND);
private_bg.params.alpha = 1.;
draw_shape(&private_bg, main_matrix);
float a = t(0, 1., 0, duration_const, EaseOut);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
cloud_bg.params.alpha = a;
draw_shape(&cloud_bg, main_matrix);
if (scroll_offset > 0) {
cloud_scroll_offset = -scroll_offset*40;
} else {
cloud_scroll_offset = -scroll_offset*15;
}
draw_ic(1);
}
//powerful_mask.params.alpha = 0.0;
// LAYER4 - DETAILS ///// ///// ///// ///// ///// ///// ///// /////
if (current_page == 0)
{
rglNormalDraw();
if (direct == 0) {
telegram_sphere.params.alpha = t(0, 1, 0, duration_const*.8, Linear);
scale = 1.005;
telegram_sphere.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&telegram_sphere, main_matrix, NORMAL);
float tt = MINf(0, -M_PI*125./180. + time * M_PI * 2 * 1.5);
float dx = sin(tt)*75;
float dy = -sin(tt)*60;
telegram_plane.params.position = xyzMake(dx, dy, 0);
float scale = (cos(tt)+1)*.5;
telegram_plane.params.scale = xyzMake(cos(tt)*scale, scale, 1);
if (tt < D2R(125)) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
draw_textured_shape(&telegram_plane, main_matrix, NORMAL_ONE);
}
}
}
else if (current_page==1)
{
rglNormalDraw();
if (direct == 1) {
telegram_sphere.params.alpha = t(1, 0, 0, duration_const, Linear);
draw_textured_shape(&telegram_sphere, main_matrix, NORMAL);
float tt = time * M_PI*2*1.5;
float dx = sin(tt)*75;
float dy = -sin(tt)*60;
telegram_plane.params.position = xyzMake(dx, dy, 0);// CGPointMake(planeCenter.x + dx, planeCenter.y + dy);
float scale = (cos(tt)+1)*.5;
telegram_plane.params.scale = xyzMake(cos(tt)*scale, scale, 1);
if (tt < D2R(125)) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
draw_textured_shape(&telegram_plane, main_matrix, NORMAL_ONE);
}
}
}
else if (current_page == 2)
{
rglNormalDrawThroughMask();
float dribbon=87;
if (direct == 1) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
ribbonLayer.rotation = scroll_offset*5 + t(180, 360, 0, duration_const, EaseInEaseOut);
mat4x4_layer(ribbons_layer, ribbonLayer, 1., 0);
float scale;
float dur = duration_const*.5;
free_knot1.params.position = xyzMake(5, -5-9, 0);
scale = t(0, 1, knot_delays[0], dur, EaseOut);
free_knot1.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&free_knot1, ribbons_layer, NORMAL_ONE);
free_knot2.params.position = xyzMake(-5, -5-9, 0);
scale = t(0, 1, knot_delays[1], dur, EaseOut);
free_knot2.params.scale = xyzMake(-scale, scale, 1);
draw_textured_shape(&free_knot2, ribbons_layer, NORMAL_ONE);
free_knot3.params.position = xyzMake(-5, 5-9, 0);
scale = t(0, 1, knot_delays[2], dur, EaseOut);
free_knot3.params.scale = xyzMake(-scale, scale, 1);
draw_textured_shape(&free_knot3, ribbons_layer, NORMAL_ONE);
free_knot3.params.position = xyzMake(5, 5-9, 0);
scale = t(0, 1, knot_delays[3], dur, EaseOut);
free_knot3.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&free_knot3, ribbons_layer, NORMAL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ribbon1.params.alpha=ribbon2.params.alpha=ribbon3.params.alpha=ribbon4.params.alpha=t(0, 1, 0, dur, EaseInEaseOut);
int ribbon_k = time > duration_const ? 1 : 0;
change_ribbon(&ribbon1, ribbonLength -8.*ribbon_k - free_scroll_offset/5.*(30-8*ribbon_k) );
ribbon1.params.position.x = scroll_offset*30*0 + t(-dribbon, 0, 0, duration_const, EaseInEaseOut);
draw_shape(&ribbon1, ribbons_layer);
change_ribbon(&ribbon2, ribbonLength -10.*ribbon_k - free_scroll_offset/5.*(22-10*ribbon_k) );
ribbon2.params.position.y = scroll_offset*15 + t(-9-dribbon, -9, 0, duration_const, EaseInEaseOut);
draw_shape(&ribbon2, ribbons_layer);
ribbon3.params.position.x = t(dribbon, 0, 0, duration_const, EaseInEaseOut);;
draw_shape(&ribbon3, ribbons_layer);
ribbon4.params.position.y = t(-9+dribbon, -9, 0, duration_const, EaseInEaseOut);;
draw_shape(&ribbon4, ribbons_layer);
//back
ribbonLayer.anchor.y = 0;
ribbonLayer.position.y = 0;
change_ribbon(&ribbon1, ribbonLength);
change_ribbon(&ribbon2, ribbonLength);
change_ribbon(&ribbon3, ribbonLength);
change_ribbon(&ribbon4, ribbonLength);
}
else
{
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
float scale = t(1, 2, 0, duration_const, EaseIn);
powerful_mask.params.scale = xyzMake(scale, scale, 1);
texture_program_type shape_texture_type;
if (backgroundColor[1] < 0.01) {
shape_texture_type = DARK;
} else if (backgroundColor[1] > 0.99) {
shape_texture_type = LIGHT;
} else {
shape_texture_type = DARK_BLUE;
}
draw_textured_shape(&powerful_mask, main_matrix, shape_texture_type);
ribbonLayer.rotation = free_scroll_offset + t_reversed(360, 360+(45+30), 0, duration_const, EaseOut);
ribbonLayer.position.y = t_reversed(0, -8, 0, duration_const*.8, EaseOut);
ribbonLayer.anchor.y = t_reversed(0, -9, 0, duration_const*.8, EaseOut);
mat4x4_layer(ribbons_layer, ribbonLayer, 1., 0);
float dur = duration_const*.5;
free_knot1.params.position = xyzMake(11/2, -11/2-9, 0);
scale = t(0, 1, knot_delays[0], dur, EaseOut);
free_knot1.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&free_knot1, ribbons_layer, NORMAL_ONE);
free_knot2.params.position = xyzMake(-11/2, -11/2-9, 0);
scale = t(0, 1, knot_delays[1], dur, EaseOut);
free_knot2.params.scale = xyzMake(-scale, scale, 1);
draw_textured_shape(&free_knot2, ribbons_layer, NORMAL_ONE);
free_knot3.params.position = xyzMake(-11/2, 11/2-9, 0);
scale = t(0, 1, knot_delays[2], dur, EaseOut);
free_knot3.params.scale = xyzMake(-scale, scale, 1);
draw_textured_shape(&free_knot3, ribbons_layer, NORMAL_ONE);
free_knot3.params.position = xyzMake(11/2, 11/2-9, 0);
scale = t(0, 1, knot_delays[3], dur, EaseOut);
free_knot3.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&free_knot3, ribbons_layer, NORMAL_ONE);
float a1=-25;
ribbon1.params.rotation = t_reversed(0, a1, 0, duration_const, EaseOut);
ribbon3.params.rotation = t_reversed(180, 180+a1, 0, duration_const, EaseOut);
float a2=0;
ribbon2.params.rotation = t_reversed(90, 90+a2, 0, duration_const, EaseOut);
ribbon4.params.rotation = t_reversed(270, 270+a2, 0, duration_const, EaseOut);
float k=.9;
ribbon2.params.alpha = ribbon4.params.alpha = t_reversed(1, 0, duration_const*.5, duration_const*.1, Linear);
int ribbon_k = time > duration_const ? 1 : 0;
ribbon_k=0;
change_ribbon(&ribbon1, t_reversed(ribbonLength-8.*ribbon_k, 0, 0, duration_const*.9, Linear) - free_scroll_offset/5.*(30-8*ribbon_k));
ribbon1.params.position.x = 0;
draw_shape(&ribbon1, ribbons_layer);
change_ribbon(&ribbon2, t_reversed(ribbonLength-10.*ribbon_k, 0, 0, duration_const*k, Linear) - free_scroll_offset/5.*(22-10*ribbon_k));
ribbon2.params.position.y = scroll_offset*15 + -9;
draw_shape(&ribbon2, ribbons_layer);
change_ribbon(&ribbon3, t_reversed(ribbonLength, 0, 0, duration_const*.9, Linear));
draw_shape(&ribbon3, ribbons_layer);
change_ribbon(&ribbon4, t_reversed(ribbonLength, 0, duration_const*.6*0, duration_const*k, Linear));
draw_shape(&ribbon4, ribbons_layer);
float infinityDurK = 1.3;
rglMaskDraw();
change_infinity(&infinity, t_reversed(0, 0.99, 0, duration_const*infinityDurK, EaseOut));
float rot1 = t(0, -50, duration_const*.5, duration_const*.8, EaseOut);
float rot2 = t(0, -30, duration_const*.8, duration_const, EaseOut);
infinity.params.rotation = rot1;
infinity.params.position.z = 1;
infinity.params.position.y = -6;
infinity.params.anchor = xyzMake(52.75, 23.5, 0);
float infinity_scale = 1.025;
infinity.params.scale = xyzMake(infinity_scale, infinity_scale, 1);
draw_shape(&infinity, main_matrix);
infinity.params.scale = xyzMake(-infinity_scale, -infinity_scale, 1);
draw_shape(&infinity, main_matrix);
rglNormalDrawThroughMask();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity_white.params.rotation = rot1 + rot2;
powerful_infinity_white.params.alpha = 1;
powerful_infinity_white.params.position.y = -6;
draw_textured_shape(&powerful_infinity_white, main_matrix, NORMAL_ONE);
}
}
else if (current_page == 3) {
if (direct == 1) {
// reset ribbons positions
ribbon1.params.position.x = 0;
ribbon2.params.position.y = -9;
ribbon3.params.position.x = 0;
ribbon4.params.position.y = -9;
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
texture_program_type shape_texture_type;
if (backgroundColor[1] < 0.01) {
shape_texture_type = DARK;
} else if (backgroundColor[1] > 0.99) {
shape_texture_type = LIGHT;
} else {
shape_texture_type = DARK_BLUE;
}
float scale = t(2, 1, 0, duration_const, EaseOut);
powerful_mask.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&powerful_mask, main_matrix, shape_texture_type);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ribbonLayer.rotation = free_scroll_offset + t(360, 360+(45+30), 0, duration_const*.8, EaseOut);
ribbonLayer.position.y = t(0, -8, 0, duration_const*.8, EaseOut);
ribbonLayer.anchor.y = t(0, -9, 0, duration_const*.8, EaseOut);
mat4x4_layer(ribbons_layer, ribbonLayer, 1., 0);
float a1=-25;
ribbon1.params.rotation = t(0, a1, 0, duration_const, EaseOut);
ribbon3.params.rotation = t(180, 180+a1, 0, duration_const, EaseOut);
float a2=0;
ribbon2.params.rotation = t(90, 90+a2, 0, duration_const, EaseOut);
ribbon4.params.rotation = t(270, 270+a2, 0, duration_const, EaseOut);
float k=.5;
ribbon2.params.alpha = ribbon4.params.alpha = t(1, 0, duration_const*k*.5, duration_const*k*.1, Linear);
int ribbon_k = time > duration_const ? 1 : 0;
change_ribbon(&ribbon1, t(ribbonLength-8.*ribbon_k-free_scroll_offset/5.*(30-8*ribbon_k), 0, 0, duration_const*.9, Linear));
draw_shape(&ribbon1, ribbons_layer);
change_ribbon(&ribbon2, t(ribbonLength-10.*ribbon_k-free_scroll_offset/5.*(22-10*ribbon_k), 0, 0, duration_const*k, Linear));
draw_shape(&ribbon2, ribbons_layer);
change_ribbon(&ribbon3, t(ribbonLength, 0, 0, duration_const*.9, Linear));
draw_shape(&ribbon3, ribbons_layer);
change_ribbon(&ribbon4, t(ribbonLength, 0, 0, duration_const*k, Linear));
draw_shape(&ribbon4, ribbons_layer);
float infinityDurK = 1.1;
if (time < duration_const*infinityDurK-.025) {
rglMaskDraw();
change_infinity(&infinity, t(0, 0.99, 0, duration_const*infinityDurK, Linear));
infinity.params.rotation = 0;
infinity.params.position.z = 1;
infinity.params.position.y = -6;
infinity.params.anchor = xyzMake(52.75, 23.5, 0);
float infinity_scale = 1.025;
infinity.params.scale = xyzMake(infinity_scale, infinity_scale, 1);
draw_shape(&infinity, main_matrix);
infinity.params.scale = xyzMake(-infinity_scale, -infinity_scale, 1);
draw_shape(&infinity, main_matrix);
rglNormalDrawThroughMask();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity_white.params.rotation = 0;
powerful_infinity_white.params.alpha = 1;
powerful_infinity_white.params.position.y = -6;
draw_textured_shape(&powerful_infinity_white, main_matrix, NORMAL_ONE);
} else {
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity.params.position.y = -6;
powerful_infinity.params.alpha = 1;
draw_textured_shape(&powerful_infinity, main_matrix, NORMAL_ONE);
}
}
else
{
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
texture_program_type shape_texture_type;
if (backgroundColor[1] < 0.01) {
shape_texture_type = DARK;
} else if (backgroundColor[1] > 0.99) {
shape_texture_type = LIGHT;
} else {
shape_texture_type = DARK_BLUE;
}
float scale = t(2, 1, 0, duration_const, EaseOut);
powerful_mask.params.scale = xyzMake(scale, scale, 1);
draw_textured_shape(&powerful_mask, main_matrix, shape_texture_type);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
scale = t(1, 2, 0, duration_const, EaseOut);
private_stroke.params.scale = xyzMake(scale, scale, 1);
private_stroke.params.rotation = t(0, -90, 0, duration_const, EaseOut);
private_stroke.params.alpha = t(1, 0, 0, duration_const, Linear);
private_stroke.params.position = xyzMake(0, t(0, -6, 0, duration_const, EaseOut), 0);
scale = t_reversed(63*2., 63*2, 0, duration_const, EaseOut);
change_rounded_rectangle_stroked(&private_stroke, CSizeMake(scale, scale), scale/2., 9);
draw_shape(&private_stroke, main_matrix);
float infinityDurK = 1.1;
if (time < duration_const*infinityDurK-.025) {
rglMaskDraw();
change_infinity(&infinity, t(0, 0.99, 0, duration_const*infinityDurK, Linear));
infinity.params.rotation = 0;
infinity.params.position.z = 1;
infinity.params.position.y = -6;
infinity.params.anchor = xyzMake(52.75, 23.5, 0);
float infinity_scale = 1.025;
infinity.params.scale = xyzMake(infinity_scale, infinity_scale, 1);
draw_shape(&infinity, main_matrix);
infinity.params.scale = xyzMake(-infinity_scale, -infinity_scale, 1);
draw_shape(&infinity, main_matrix);
rglNormalDrawThroughMask();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity_white.params.rotation = 0;
powerful_infinity_white.params.alpha = 1;
powerful_infinity_white.params.position.y = -6;
draw_textured_shape(&powerful_infinity_white, main_matrix, NORMAL_ONE);
} else {
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity.params.position.y = -6;
powerful_infinity.params.alpha = 1;
draw_textured_shape(&powerful_infinity, main_matrix, NORMAL_ONE);
}
}
}
else if (current_page == 4)
{
private_stroke.params.scale = xyzMake(1, 1, 1);
private_scroll_offset = scroll_offset*5;
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = t(1, 2, 0, duration_const, EaseOut);//*1.6;
if (scale < 1.5) {
powerful_mask.params.scale=xyzMake(scale, scale, 1);
}
if (direct == 1) {
privateLayer.rotation = private_scroll_offset + t(-90, 0, 0, duration_const, EaseOut);
} else {
privateLayer.rotation = private_scroll_offset + t(90, 0, 0, duration_const*private_back_k, EaseOut);
}
mat4x4_layer(private_matrix, privateLayer, 1, 0);
if (direct == 1) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
powerful_infinity.params.position.y = -6;
powerful_infinity.params.alpha = t(1, 0, 0, duration_const*.5*.5, EaseIn);
draw_textured_shape(&powerful_infinity, main_matrix, NORMAL_ONE);
}
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if (direct == 1) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = t(.5, 1., 0, duration_const, EaseOut);
private_door.params.scale = xyzMake(scale,scale,1);
private_door.params.alpha = t(.0, 1., 0, duration_const, EaseOut);
draw_textured_shape(&private_door, main_matrix, NORMAL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
private_stroke.params.rotation = private_scroll_offset;
private_stroke.params.alpha = 1;
private_stroke.params.position = xyzMake(0, 0, 0);
scale = t(63, 63*2, 0, duration_const, EaseOut);
change_rounded_rectangle_stroked(&private_stroke, CSizeMake(scale, scale), scale/2., 9);
draw_shape(&private_stroke, main_matrix);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
float k = .0;
scale = t(.5, 1., duration_const*k, duration_const, EaseOut);
private_keyhole_body.params.rotation = private_scroll_offset;
private_keyhole_body.params.scale = xyzMake(scale,scale,1);
private_keyhole_body.params.alpha = t(.0, 1., duration_const*k, duration_const, EaseOut);
draw_safe(0, 1, t(0, 1, 0, duration_const, Linear));
}
else
{
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = t(.5, 1., 0, duration_const*private_back_k, EaseOut);
private_door.params.scale = xyzMake(scale,scale,1);
private_door.params.alpha = t(.0, 1., 0, duration_const*private_back_k, EaseOut);
draw_textured_shape(&private_door, main_matrix, NORMAL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
private_stroke.params.rotation = private_scroll_offset;
private_stroke.params.alpha = t(0, 1, 0, duration_const*.25, Linear);
private_stroke.params.position = xyzMake(0, 0, 0);
scale = t(63, 63*2, 0, duration_const*private_back_k, EaseOut);
change_rounded_rectangle_stroked(&private_stroke, CSizeMake(scale, scale), scale/2., 9);
draw_shape(&private_stroke, main_matrix);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = t(.5, 1., 0, duration_const*private_back_k, EaseOut);
private_keyhole_body.params.rotation = private_scroll_offset;
private_keyhole_body.params.scale = xyzMake(scale,scale,1);
private_keyhole_body.params.alpha = t(.0, 1., 0, duration_const*private_back_k, EaseOut);
if (time < duration_const*.4) {
cloud_cover.params.position.y=t_reversed(118/2+50, 118/2, duration_const*.8*private_back_k, duration_const*private_back_k, EaseOut);
if (backgroundColor[1] < 0.01) {
vec4 color = {0.0,0.0,0.0,1.0};
draw_colored_shape(&cloud_cover, main_matrix, color);
} else if (backgroundColor[1] > 0.99) {
vec4 color = {1.0,1.0,1.0,1.0};
draw_colored_shape(&cloud_cover, main_matrix, color);
} else {
vec4 color = {0.09,0.133,0.176, 1.0f};
draw_colored_shape(&cloud_cover, main_matrix, color);
}
}
draw_safe(0, t(0,1,duration_const*private_back_k*.0, duration_const*private_back_k, Linear), t(0, 1, 0, duration_const, Linear));
}
}
else if (current_page == 5) {
float private_fade_k = .5;
rglNormalDraw();
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = 1;
private_door.params.scale = xyzMake(scale,scale,1);
private_door.params.alpha = t(1, 0, 0, duration_const*private_fade_k*.5, EaseOut);
draw_textured_shape(&private_door, main_matrix, NORMAL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
private_stroke.params.rotation = private_scroll_offset;
private_stroke.params.alpha = t(1, 0, 0, duration_const*private_fade_k*.5, EaseOut);
scale = t(244/2, r2*2, 0, duration_const, EaseOut);
change_rounded_rectangle_stroked(&private_stroke, CSizeMake(scale, scale), scale/2., 9);
draw_shape(&private_stroke, main_matrix);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
scale = 1;
private_keyhole_body.params.rotation = private_scroll_offset;
private_keyhole_body.params.scale = xyzMake(scale,scale,1);
private_keyhole_body.params.alpha = t(1.0, 0., 0, duration_const*private_fade_k*.5, EaseOut);
privateLayer.rotation = private_scroll_offset;
mat4x4_layer(private_matrix, privateLayer, t(1, .9, 0, duration_const*private_fade_k, EaseOut), 0);
cloud_cover.params.position.y = t(118/2+50, 118/2, 0, duration_const, EaseOut);
if (backgroundColor[1] < 0.01) {
vec4 color = {0.0,0.0,0.0,1.0};
draw_colored_shape(&cloud_cover, main_matrix, color);
} else if (backgroundColor[1] > 0.99) {
vec4 color = {1.0,1.0,1.0,1.0};
draw_colored_shape(&cloud_cover, main_matrix, color);
} else {
vec4 color = {0.09,0.133,0.176, 1.0f};
draw_colored_shape(&cloud_cover, main_matrix, color);
}
}
prev_page = current_page;
}