diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/assets/back_btn.png b/assets/back_btn.png deleted file mode 100755 index 4176c8b..0000000 Binary files a/assets/back_btn.png and /dev/null differ diff --git a/assets/ball.png b/assets/ball.png deleted file mode 100755 index 4a2cfc5..0000000 Binary files a/assets/ball.png and /dev/null differ diff --git a/assets/ball_glow.png b/assets/ball_glow.png deleted file mode 100755 index 5fc1138..0000000 Binary files a/assets/ball_glow.png and /dev/null differ diff --git a/assets/block1.png b/assets/block1.png deleted file mode 100755 index 8cd98ae..0000000 Binary files a/assets/block1.png and /dev/null differ diff --git a/assets/block2.png b/assets/block2.png deleted file mode 100755 index d38c770..0000000 Binary files a/assets/block2.png and /dev/null differ diff --git a/assets/block3.png b/assets/block3.png deleted file mode 100755 index 2faf8e7..0000000 Binary files a/assets/block3.png and /dev/null differ diff --git a/assets/bonus_floor.png b/assets/bonus_floor.png deleted file mode 100755 index 58648e9..0000000 Binary files a/assets/bonus_floor.png and /dev/null differ diff --git a/assets/bonus_gothrough.png b/assets/bonus_gothrough.png deleted file mode 100755 index a7eb20c..0000000 Binary files a/assets/bonus_gothrough.png and /dev/null differ diff --git a/assets/bonus_multiplier.png b/assets/bonus_multiplier.png deleted file mode 100755 index 4efbc80..0000000 Binary files a/assets/bonus_multiplier.png and /dev/null differ diff --git a/assets/brickshader_fragment.txt b/assets/brickshader_fragment.txt deleted file mode 100755 index ab2ef56..0000000 --- a/assets/brickshader_fragment.txt +++ /dev/null @@ -1,15 +0,0 @@ -precision mediump float; -uniform sampler2D Texture; -uniform float Transparency; -uniform vec4 BrickColor; -varying vec2 texCoord; - -void main() -{ - vec4 color = BrickColor * texture2D(Texture,texCoord).rgba; - - gl_FragColor = vec4(color.rgb, color.a * Transparency); - - - -} \ No newline at end of file diff --git a/assets/brickshader_vertex.txt b/assets/brickshader_vertex.txt deleted file mode 100755 index 72d9f46..0000000 --- a/assets/brickshader_vertex.txt +++ /dev/null @@ -1,12 +0,0 @@ -attribute vec3 vPosition; -attribute vec2 vTexCoord; -varying vec2 texCoord; - -uniform mat4 ProjectionMatrix; - -void main() -{ - //480x320 - gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); - texCoord = vTexCoord; -} \ No newline at end of file diff --git a/assets/console_bkg.bmp b/assets/console_bkg.bmp deleted file mode 100755 index d32ee4c..0000000 Binary files a/assets/console_bkg.bmp and /dev/null differ diff --git a/assets/credits.png b/assets/credits.png deleted file mode 100755 index 6debee7..0000000 Binary files a/assets/credits.png and /dev/null differ diff --git a/assets/emoji/Asset 10@20x.png b/assets/emoji/Asset 10@20x.png new file mode 100755 index 0000000..650f168 Binary files /dev/null and b/assets/emoji/Asset 10@20x.png differ diff --git a/assets/emoji/Asset 11@20x.png b/assets/emoji/Asset 11@20x.png new file mode 100755 index 0000000..047abd4 Binary files /dev/null and b/assets/emoji/Asset 11@20x.png differ diff --git a/assets/emoji/Asset 13@20x.png b/assets/emoji/Asset 13@20x.png new file mode 100755 index 0000000..85c585e Binary files /dev/null and b/assets/emoji/Asset 13@20x.png differ diff --git a/assets/emoji/Asset 14@20x.png b/assets/emoji/Asset 14@20x.png new file mode 100755 index 0000000..a30b740 Binary files /dev/null and b/assets/emoji/Asset 14@20x.png differ diff --git a/assets/emoji/Asset 15@20x.png b/assets/emoji/Asset 15@20x.png new file mode 100755 index 0000000..584da41 Binary files /dev/null and b/assets/emoji/Asset 15@20x.png differ diff --git a/assets/emoji/Asset 16@20x.png b/assets/emoji/Asset 16@20x.png new file mode 100755 index 0000000..8b24795 Binary files /dev/null and b/assets/emoji/Asset 16@20x.png differ diff --git a/assets/emoji/Asset 17@20x.png b/assets/emoji/Asset 17@20x.png new file mode 100755 index 0000000..e5a1b08 Binary files /dev/null and b/assets/emoji/Asset 17@20x.png differ diff --git a/assets/emoji/Asset 18@20x.png b/assets/emoji/Asset 18@20x.png new file mode 100755 index 0000000..23cf217 Binary files /dev/null and b/assets/emoji/Asset 18@20x.png differ diff --git a/assets/emoji/Asset 19@20x.png b/assets/emoji/Asset 19@20x.png new file mode 100755 index 0000000..870c97a Binary files /dev/null and b/assets/emoji/Asset 19@20x.png differ diff --git a/assets/emoji/Asset 20@20x.png b/assets/emoji/Asset 20@20x.png new file mode 100755 index 0000000..00a9954 Binary files /dev/null and b/assets/emoji/Asset 20@20x.png differ diff --git a/assets/emoji/Asset 21@20x.png b/assets/emoji/Asset 21@20x.png new file mode 100755 index 0000000..0990db4 Binary files /dev/null and b/assets/emoji/Asset 21@20x.png differ diff --git a/assets/emoji/Asset 22@20x.png b/assets/emoji/Asset 22@20x.png new file mode 100755 index 0000000..97b82b3 Binary files /dev/null and b/assets/emoji/Asset 22@20x.png differ diff --git a/assets/emoji/Asset 23@20x.png b/assets/emoji/Asset 23@20x.png new file mode 100755 index 0000000..55065f0 Binary files /dev/null and b/assets/emoji/Asset 23@20x.png differ diff --git a/assets/emoji/Asset 24@20x.png b/assets/emoji/Asset 24@20x.png new file mode 100755 index 0000000..aeea44e Binary files /dev/null and b/assets/emoji/Asset 24@20x.png differ diff --git a/assets/emoji/Asset 25@20x.png b/assets/emoji/Asset 25@20x.png new file mode 100755 index 0000000..3d4a86d Binary files /dev/null and b/assets/emoji/Asset 25@20x.png differ diff --git a/assets/emoji/Asset 26@20x.png b/assets/emoji/Asset 26@20x.png new file mode 100755 index 0000000..4c9507a Binary files /dev/null and b/assets/emoji/Asset 26@20x.png differ diff --git a/assets/emoji/Asset 27@20x.png b/assets/emoji/Asset 27@20x.png new file mode 100755 index 0000000..55420b2 Binary files /dev/null and b/assets/emoji/Asset 27@20x.png differ diff --git a/assets/emoji/Asset 28@20x.png b/assets/emoji/Asset 28@20x.png new file mode 100755 index 0000000..c4750c7 Binary files /dev/null and b/assets/emoji/Asset 28@20x.png differ diff --git a/assets/emoji/Asset 3@20x.png b/assets/emoji/Asset 3@20x.png new file mode 100755 index 0000000..09e39ad Binary files /dev/null and b/assets/emoji/Asset 3@20x.png differ diff --git a/assets/emoji/Asset 4@20x.png b/assets/emoji/Asset 4@20x.png new file mode 100755 index 0000000..381f1fc Binary files /dev/null and b/assets/emoji/Asset 4@20x.png differ diff --git a/assets/emoji/Asset 5@20x.png b/assets/emoji/Asset 5@20x.png new file mode 100755 index 0000000..d36cca0 Binary files /dev/null and b/assets/emoji/Asset 5@20x.png differ diff --git a/assets/emoji/Asset 6@20x.png b/assets/emoji/Asset 6@20x.png new file mode 100755 index 0000000..6537bda Binary files /dev/null and b/assets/emoji/Asset 6@20x.png differ diff --git a/assets/emoji/Asset 7@20x.png b/assets/emoji/Asset 7@20x.png new file mode 100755 index 0000000..3ecb2f2 Binary files /dev/null and b/assets/emoji/Asset 7@20x.png differ diff --git a/assets/emoji/Asset 8@20x.png b/assets/emoji/Asset 8@20x.png new file mode 100755 index 0000000..033f53e Binary files /dev/null and b/assets/emoji/Asset 8@20x.png differ diff --git a/assets/emoji/Asset 9@20x.png b/assets/emoji/Asset 9@20x.png new file mode 100755 index 0000000..25698ea Binary files /dev/null and b/assets/emoji/Asset 9@20x.png differ diff --git a/assets/emoji/emojis.json b/assets/emoji/emojis.json new file mode 100755 index 0000000..003c9ce --- /dev/null +++ b/assets/emoji/emojis.json @@ -0,0 +1,249 @@ +{ + "transform version": "V1", + + "models": [ + { + "type": "EmojiModel", + "name": "Smile" + }], + + "renderParams": [ + { + "vertexShader": "./assets/shaders/vertex/orthoVertexShader.txt", + "fragmentShader": "./assets/shaders/fragment/orthoFragmentShader.txt", + "alphaTest": "true", + "blend": "true", + "TAG": "smile & tongue 0" + } + ], + + "initialModules": [0, 1, 2, 3, 4], + + "modules": [ + { + "iconPath": "./assets/fx/emoji/Asset 3@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 3@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 24@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 24@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 13@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 13@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 23@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 23@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 19@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 19@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 20@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 20@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 17@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 17@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 18@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 18@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 15@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 15@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 16@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 16@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 21@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 21@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 4@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 4@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 22@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 22@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 14@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 14@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 11@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 11@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 25@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 25@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 26@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 26@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 27@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 27@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 28@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 28@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 5@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 5@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 6@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 6@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 7@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 7@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 8@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 8@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 9@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 9@20x.png" + } + ] + }, + { + "iconPath": "./assets/fx/emoji/Asset 10@20x.png", + "suits": [ + { + "renderParamsID": 0, + "emojiTexture": "./assets/fx/emoji/Asset 10@20x.png" + } + ] + } + ] +} \ No newline at end of file diff --git a/assets/game_end.png b/assets/game_end.png deleted file mode 100755 index e7fb288..0000000 Binary files a/assets/game_end.png and /dev/null differ diff --git a/assets/level1.txt b/assets/level1.txt deleted file mode 100755 index 1cfbdae..0000000 --- a/assets/level1.txt +++ /dev/null @@ -1,33 +0,0 @@ -0, 255, 255, 255 -0, 0, 0, 255 -255, 0, 0, 255 -255, 40, 40, 255 -255, 128, 128, 255 -Colormap -111111111111 -111111111111 -111111111111 -222222222222 -222222222222 -222222222222 -222222222222 -333333333333 -333333333333 -333333333333 -000000000000 -000000000000 -000000000000 -Brickmap -111111111111 -111111111111 -111111111111 -000000000000 -111111111111 -111111111111 -000000000000 -111111111111 -111111111111 -000000000000 -000000000000 -000000000000 -000000000000 \ No newline at end of file diff --git a/assets/level10.txt b/assets/level10.txt deleted file mode 100755 index 85caa92..0000000 --- a/assets/level10.txt +++ /dev/null @@ -1,32 +0,0 @@ -0, 255, 255, 255 -0, 0, 0, 255 -255, 0, 190, 255 -255, 0, 255, 255 -Colormap -002222222200 -002222222200 -000222222000 -000022220000 -111002200111 -111100001111 -011110011110 -001111111100 -000111111000 -000011110000 -000001100000 -000000000000 -000000000000 -Brickmap -002111111200 -002211112200 -000221122000 -000022220000 -111002200111 -221100001122 -022110011220 -002211112200 -000221122000 -000022220000 -000002200000 -000000000000 -000000000000 diff --git a/assets/level11.txt b/assets/level11.txt deleted file mode 100755 index e9570db..0000000 --- a/assets/level11.txt +++ /dev/null @@ -1,33 +0,0 @@ -255, 255, 255, 255 -0, 0, 0, 255 -0, 237, 255, 255 -0, 144, 255, 255 -0, 59, 255, 255 -Colormap -333333333333 -333333333333 -333333333333 -000000000000 -222220022222 -222220022222 -222220022222 -000000000000 -111110011111 -111110011111 -111110011111 -000000000000 -000000000000 -Brickmap -111111111111 -111111111111 -222222222222 -000000000000 -111110011111 -111110011111 -222220022222 -000000000000 -111110011111 -111110011111 -333330033333 -000000000000 -000000000000 diff --git a/assets/level12.txt b/assets/level12.txt deleted file mode 100755 index 3284830..0000000 --- a/assets/level12.txt +++ /dev/null @@ -1,32 +0,0 @@ -255, 128, 128, 255 -0, 0, 0, 255 -159, 240, 255, 255 -0, 148, 255, 255 -Colormap -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -Brickmap -000311113000 -000311113000 -333311113333 -111111111111 -111111111111 -222221122222 -333321123333 -000321123000 -000321123000 -000322223000 -000333333000 -000000000000 -000000000000 diff --git a/assets/level1ogg.ogg b/assets/level1ogg.ogg deleted file mode 100755 index ce86d31..0000000 Binary files a/assets/level1ogg.ogg and /dev/null differ diff --git a/assets/level2.txt b/assets/level2.txt deleted file mode 100755 index c1bd395..0000000 --- a/assets/level2.txt +++ /dev/null @@ -1,32 +0,0 @@ -255, 0, 0, 255 -0, 0, 0, 255 -0, 255, 255, 255 -7, 255, 189, 255 -Colormap -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -111111111111 -222222222222 -000000000000 -Brickmap -111011110111 -111011110111 -222022220222 -000000000000 -111011110111 -222022220222 -000000000000 -111000000111 -222000000222 -000000000000 -222222222222 -000000000000 -000000000000 diff --git a/assets/level3.txt b/assets/level3.txt deleted file mode 100755 index 8a9521e..0000000 --- a/assets/level3.txt +++ /dev/null @@ -1,33 +0,0 @@ -0, 255, 255, 255 -0, 0, 0, 255 -0, 151, 113, 255 -7, 255, 189, 255 -128, 143, 128, 255 -Colormap -000000000000 -033333333330 -031111111130 -031111111130 -033333333330 -000000000000 -033330033330 -032230032230 -032230032230 -033330033330 -000000000000 -000000000000 -000000000000 -Brickmap -000000000000 -022222222220 -021111111120 -021111111120 -022222222220 -000000000000 -022220022220 -021120021120 -021120021120 -022220022220 -000000000000 -000000000000 -000000000000 diff --git a/assets/level4.txt b/assets/level4.txt deleted file mode 100755 index 7c83fc1..0000000 --- a/assets/level4.txt +++ /dev/null @@ -1,33 +0,0 @@ -255, 0, 0, 255 -0, 0, 0, 255 -101, 97, 255, 255 -5, 186, 255, 255 -105, 201, 255, 255 -Colormap -000000333333 -000003333333 -000033311111 -333333133333 -333331333333 -333313333333 -111133311111 -333333100000 -333331000000 -333310000000 -111100000000 -000000000000 -000000000000 -Brickmap -000000111111 -000001111111 -000011133333 -111111311111 -111113111111 -111131111111 -333311133333 -111111300000 -111113000000 -111130000000 -333300000000 -000000000000 -000000000000 diff --git a/assets/level5.txt b/assets/level5.txt deleted file mode 100755 index 1a5d7c4..0000000 --- a/assets/level5.txt +++ /dev/null @@ -1,32 +0,0 @@ -255, 0, 255, 255 -0, 0, 0, 255 -163, 255, 198, 255 -0, 255, 182, 255 -Colormap -000022220000 -000222222000 -000022220000 -111000000111 -111100001111 -111110011111 -111111111111 -111111111111 -111111111111 -111111111111 -000000000000 -000000000000 -000000000000 -Brickmap -000033330000 -000311113000 -000033330000 -111000000111 -111100001111 -111110011111 -111111111111 -111111111111 -111111111111 -222222222222 -000000000000 -000000000000 -000000000000 diff --git a/assets/level6.txt b/assets/level6.txt deleted file mode 100755 index cf32e5e..0000000 --- a/assets/level6.txt +++ /dev/null @@ -1,33 +0,0 @@ -255, 255, 255, 255 -0, 0, 0, 255 -255, 200, 5, 255 -255, 153, 0, 255 -255, 97, 0, 255 -Colormap -000000000000 -000333000333 -000333000333 -000333000333 -222000222000 -222000222000 -222000222000 -000111000111 -000111000111 -000111000111 -000000000000 -000000000000 -000000000000 -Brickmap -000000000000 -000222000222 -000212000212 -000222000222 -222000222000 -212000212000 -222000222000 -000222000222 -000212000212 -000222000222 -000000000000 -000000000000 -000000000000 diff --git a/assets/level7.txt b/assets/level7.txt deleted file mode 100755 index 5a11037..0000000 --- a/assets/level7.txt +++ /dev/null @@ -1,33 +0,0 @@ -255, 255, 0, 255 -0, 0, 0, 255 -230, 230, 230, 255 -195, 195, 195, 255 -150, 150, 150, 255 -Colormap -333333333333 -030030030030 -030030030030 -030030030030 -222222222222 -020020020020 -020020020020 -010010010010 -010010010010 -020020020020 -000000000000 -000000000000 -000000000000 -Brickmap -111111111111 -010010010010 -010010010010 -010010010010 -222222222222 -010010010010 -010010010010 -010010010010 -010010010010 -020020020020 -000000000000 -000000000000 -000000000000 diff --git a/assets/level8.txt b/assets/level8.txt deleted file mode 100755 index 8e97e38..0000000 --- a/assets/level8.txt +++ /dev/null @@ -1,32 +0,0 @@ -0, 255, 255, 255 -0, 0, 0, 255 -217, 56, 62, 255 -132, 56, 62, 255 -Colormap -111111111111 -111111111111 -222211112222 -000211112000 -000211112000 -022211112220 -021111111120 -021111111120 -021111111120 -022222222220 -000000000000 -000000000000 -000000000000 -Brickmap -111111111111 -111111111111 -222211112222 -000211112000 -000211112000 -022211112220 -021111111120 -021111111120 -021111111120 -033333333330 -000000000000 -000000000000 -000000000000 diff --git a/assets/level9.txt b/assets/level9.txt deleted file mode 100755 index e698b59..0000000 --- a/assets/level9.txt +++ /dev/null @@ -1,32 +0,0 @@ -0, 255, 0, 255 -0, 0, 0, 255 -255, 221, 0, 255 -255, 0, 0, 255 -Colormap -222220022222 -222220022222 -222220022222 -222220022222 -000000000000 -111111111111 -111111111111 -000000000000 -111111111111 -111111111111 -000000000000 -000000000000 -000000000000 -Brickmap -111110011111 -111110011111 -111110011111 -222220022222 -000000000000 -111111111111 -333333333333 -000000000000 -111111111111 -222222222222 -000000000000 -000000000000 -000000000000 diff --git a/assets/levelshot1.png b/assets/levelshot1.png deleted file mode 100755 index 48471ef..0000000 Binary files a/assets/levelshot1.png and /dev/null differ diff --git a/assets/levelshot10.png b/assets/levelshot10.png deleted file mode 100755 index de464ec..0000000 Binary files a/assets/levelshot10.png and /dev/null differ diff --git a/assets/levelshot11.png b/assets/levelshot11.png deleted file mode 100755 index 96bf193..0000000 Binary files a/assets/levelshot11.png and /dev/null differ diff --git a/assets/levelshot12.png b/assets/levelshot12.png deleted file mode 100755 index 4696264..0000000 Binary files a/assets/levelshot12.png and /dev/null differ diff --git a/assets/levelshot2.png b/assets/levelshot2.png deleted file mode 100755 index a9872d8..0000000 Binary files a/assets/levelshot2.png and /dev/null differ diff --git a/assets/levelshot3.png b/assets/levelshot3.png deleted file mode 100755 index 02e5a20..0000000 Binary files a/assets/levelshot3.png and /dev/null differ diff --git a/assets/levelshot4.png b/assets/levelshot4.png deleted file mode 100755 index f17800d..0000000 Binary files a/assets/levelshot4.png and /dev/null differ diff --git a/assets/levelshot5.png b/assets/levelshot5.png deleted file mode 100755 index a80ca69..0000000 Binary files a/assets/levelshot5.png and /dev/null differ diff --git a/assets/levelshot6.png b/assets/levelshot6.png deleted file mode 100755 index a21edcc..0000000 Binary files a/assets/levelshot6.png and /dev/null differ diff --git a/assets/levelshot7.png b/assets/levelshot7.png deleted file mode 100755 index 3875a7a..0000000 Binary files a/assets/levelshot7.png and /dev/null differ diff --git a/assets/levelshot8.png b/assets/levelshot8.png deleted file mode 100755 index 6f99af8..0000000 Binary files a/assets/levelshot8.png and /dev/null differ diff --git a/assets/levelshot9.png b/assets/levelshot9.png deleted file mode 100755 index 4fd00ec..0000000 Binary files a/assets/levelshot9.png and /dev/null differ diff --git a/assets/loading.png b/assets/loading.png deleted file mode 100755 index 482d602..0000000 Binary files a/assets/loading.png and /dev/null differ diff --git a/assets/logo_small.png b/assets/logo_small.png deleted file mode 100755 index 4596028..0000000 Binary files a/assets/logo_small.png and /dev/null differ diff --git a/assets/main_menu_bkg_left.png b/assets/main_menu_bkg_left.png deleted file mode 100755 index afd94ec..0000000 Binary files a/assets/main_menu_bkg_left.png and /dev/null differ diff --git a/assets/main_menu_bkg_right.png b/assets/main_menu_bkg_right.png deleted file mode 100755 index 066d439..0000000 Binary files a/assets/main_menu_bkg_right.png and /dev/null differ diff --git a/assets/reflector.png b/assets/reflector.png deleted file mode 100755 index 6d3bcd2..0000000 Binary files a/assets/reflector.png and /dev/null differ diff --git a/assets/select_level.png b/assets/select_level.png deleted file mode 100755 index 9e2ee25..0000000 Binary files a/assets/select_level.png and /dev/null differ diff --git a/assets/shutterstock1.png b/assets/shutterstock1.png deleted file mode 100755 index a9f949a..0000000 Binary files a/assets/shutterstock1.png and /dev/null differ diff --git a/assets/shutterstock10.png b/assets/shutterstock10.png deleted file mode 100755 index e028dd6..0000000 Binary files a/assets/shutterstock10.png and /dev/null differ diff --git a/assets/shutterstock11.png b/assets/shutterstock11.png deleted file mode 100755 index 51f626e..0000000 Binary files a/assets/shutterstock11.png and /dev/null differ diff --git a/assets/shutterstock12.png b/assets/shutterstock12.png deleted file mode 100755 index badbbe0..0000000 Binary files a/assets/shutterstock12.png and /dev/null differ diff --git a/assets/shutterstock2.png b/assets/shutterstock2.png deleted file mode 100755 index c6ffbb5..0000000 Binary files a/assets/shutterstock2.png and /dev/null differ diff --git a/assets/shutterstock3.png b/assets/shutterstock3.png deleted file mode 100755 index 22b11ba..0000000 Binary files a/assets/shutterstock3.png and /dev/null differ diff --git a/assets/shutterstock4.png b/assets/shutterstock4.png deleted file mode 100755 index 5756d84..0000000 Binary files a/assets/shutterstock4.png and /dev/null differ diff --git a/assets/shutterstock5.png b/assets/shutterstock5.png deleted file mode 100755 index fcb63f7..0000000 Binary files a/assets/shutterstock5.png and /dev/null differ diff --git a/assets/shutterstock6.png b/assets/shutterstock6.png deleted file mode 100755 index 40b1b3a..0000000 Binary files a/assets/shutterstock6.png and /dev/null differ diff --git a/assets/shutterstock7.png b/assets/shutterstock7.png deleted file mode 100755 index 12e82a6..0000000 Binary files a/assets/shutterstock7.png and /dev/null differ diff --git a/assets/shutterstock8.png b/assets/shutterstock8.png deleted file mode 100755 index dba9cbe..0000000 Binary files a/assets/shutterstock8.png and /dev/null differ diff --git a/assets/shutterstock9.png b/assets/shutterstock9.png deleted file mode 100755 index 33ce46f..0000000 Binary files a/assets/shutterstock9.png and /dev/null differ diff --git a/assets/slide_up_btn.png b/assets/slide_up_btn.png deleted file mode 100755 index fb26969..0000000 Binary files a/assets/slide_up_btn.png and /dev/null differ diff --git a/assets/tap_to_continue_btn.png b/assets/tap_to_continue_btn.png deleted file mode 100755 index b9b51c1..0000000 Binary files a/assets/tap_to_continue_btn.png and /dev/null differ diff --git a/assets/wall_bonus.png b/assets/wall_bonus.png deleted file mode 100755 index 7f94f41..0000000 Binary files a/assets/wall_bonus.png and /dev/null differ diff --git a/assets/wall_left.png b/assets/wall_left.png deleted file mode 100755 index 9baad70..0000000 Binary files a/assets/wall_left.png and /dev/null differ diff --git a/assets/wall_right.png b/assets/wall_right.png deleted file mode 100755 index ab50ea3..0000000 Binary files a/assets/wall_right.png and /dev/null differ diff --git a/assets/wall_up.png b/assets/wall_up.png deleted file mode 100755 index c14e614..0000000 Binary files a/assets/wall_up.png and /dev/null differ diff --git a/game/Android.mk b/game/Android.mk old mode 100644 new mode 100755 diff --git a/game/Application.mk b/game/Application.mk old mode 100644 new mode 100755 diff --git a/game/DoubleHitBalls.dev b/game/DoubleHitBalls.dev old mode 100644 new mode 100755 diff --git a/game/android_api.cpp b/game/android_api.cpp old mode 100644 new mode 100755 diff --git a/game/android_api.h b/game/android_api.h old mode 100644 new mode 100755 diff --git a/game/creditscode.cpp b/game/creditscode.cpp deleted file mode 100644 index b5e1383..0000000 --- a/game/creditscode.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "creditscode.h" -#include "include/Engine.h" - -#include "main_code.h" - -const int TGameCredits::CONST_STATE_APPEARING = 0; -const int TGameCredits::CONST_STATE_APPEARED = 1; -const int TGameCredits::CONST_STATE_DISAPPEARING = 2; -const int TGameCredits::CONST_STATE_DISAPPEARED = 3; - -const float TGameCredits::CONST_APPEAR_TIME = 150.f; - -TGameCredits::TGameCredits() - : TGameAreaAncestor() - , StateTimer(0) - , State(CONST_STATE_DISAPPEARED) -{ -} - -void TGameCredits::Draw() -{ - //*SE::Console << "TGameCredits::Draw"; - float transparency = StateTimer/CONST_APPEAR_TIME; - - - RenderUniform1f("Transparency", transparency); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList["main_menu_bkg_left"]); - Renderer->DrawRect(Vector2f(0, 0.f), Vector2f(480.f, 320.f)); - - const Vector2f creditsPos(140.f, 130.f); - - const Vector2f creditsHalfSize(128.f, 128.f); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_CREDITS_TEXTURE]); - Renderer->DrawRect(creditsPos-creditsHalfSize, creditsPos+creditsHalfSize); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOGO_SMALL_TEXTURE]); - Renderer->DrawRect(Vector2f(240.f-128.f+15.f, 320.f-64.f), Vector2f(240.f+128.f+15.f, 320.f)); - - CheckGlError("Draw TGameCredits"); -} - -void TGameCredits::Update(size_t dt) -{ - if (State == CONST_STATE_APPEARING) - { - *SE::Console << "TGameCredits::Update - CONST_STATE_APPEARING"; - StateTimer += dt; - if (StateTimer >= CONST_APPEAR_TIME) - { - StateTimer = CONST_APPEAR_TIME; - State = CONST_STATE_APPEARED; - } - } - else if (State == CONST_STATE_DISAPPEARING) - { - StateTimer -= dt; - if (StateTimer <= 0.f) - { - StateTimer = 0.f; - State = CONST_STATE_DISAPPEARED; - } - } -} - -void TGameCredits::OnTapDown(Vector2f p) -{ - *SE::Console << "TGameCredits::OnTapDown"; - Application->GoFromCreditsToMenu(); -} - -void TGameCredits::StartAppear() -{ - *SE::Console << "TGameCredits::StartAppear"; - State = CONST_STATE_APPEARING; -} - -void TGameCredits::StartDisappear() -{ - *SE::Console << "TGameCredits::StartDisappear"; - State = CONST_STATE_DISAPPEARING; -} diff --git a/game/creditscode.h b/game/creditscode.h deleted file mode 100644 index 1854de1..0000000 --- a/game/creditscode.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef CREDITSCODE_H_INCLUDED -#define CREDITSCODE_H_INCLUDED - -#include "game_area_interface.h" - -using namespace SE; - - -class TGameCredits : public TGameAreaAncestor -{ - static const int CONST_STATE_APPEARING; - static const int CONST_STATE_APPEARED; - static const int CONST_STATE_DISAPPEARING; - static const int CONST_STATE_DISAPPEARED; - static const float CONST_APPEAR_TIME; - - - int State; - float StateTimer; - -public: - - TGameCredits(); - - virtual void Draw(); - virtual void Update(size_t dt); - virtual void OnTapDown(Vector2f p); - - void StartAppear(); - void StartDisappear(); -}; - - -#endif diff --git a/game/game_area_interface.h b/game/game_area_interface.h deleted file mode 100644 index e8b941a..0000000 --- a/game/game_area_interface.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GAME_AREA_INTERFACE_H_INCLUDED -#define GAME_AREA_INTERFACE_H_INCLUDED - -#include "include/Engine.h" - -using namespace SE; - - -class TGameAreaAncestor -{ -public: - virtual void Draw() { } - virtual void Update(size_t) { } - virtual void OnTapUp(Vector2f) { } - virtual void OnTapUpAfterMove(Vector2f) { } - - virtual void OnTapDown(Vector2f) { } - virtual void OnFling(Vector2f) { } - virtual void OnScroll(Vector2f) { } - - virtual ~TGameAreaAncestor() { } //By default destructor is not virtual -}; - - -#endif diff --git a/game/gamecode.cpp b/game/gamecode.cpp deleted file mode 100644 index eb3d70d..0000000 --- a/game/gamecode.cpp +++ /dev/null @@ -1,1628 +0,0 @@ -#include "gamecode.h" -#include "main_code.h" - -using namespace SE; -//const std::string fendl = "\x0D\x0A"; //Windows-style, for files - -const int CONST_LEVELSTATE_STANDBY = 0; -const int CONST_LEVELSTATE_PLAYING = 1; -const int CONST_LEVELSTATE_GO_TO_PAUSE = 2; -const int CONST_LEVELSTATE_PAUSE = 3; -const int CONST_LEVELSTATE_LOADING = 4; -const int CONST_LEVELSTATE_NODRAW = 5; -const int CONST_LEVELSTATE_FINISH_FREEZE = 6; -const int CONST_LEVELSTATE_FINISHED = 7; - -const float CONST_TIMER_LOADING = 150.f; - -const float CONST_PAUSE_APPEAR_TIME = 150.f; - -const float CONST_FINISH_FREEZE_TIME = 1000.f; -const float CONST_FINISHING_TIME = 250.f; - -const float CONST_BALL_VELOCITY = 200.f; - -const Vector2f CONST_SLIDE_UP_POS(240.f, 64.f); - -const Vector2f CONST_TAP_TO_CONTINUE_POS(240.f, 200.f); - -bool operator<(const PairColorTexture& p1, const PairColorTexture& p2) -{ - if (p1.second == p2.second) - { - if (p1.first(0) == p2.first(0)) - { - if (p1.first(1) == p2.first(1)) - { - if (p1.first(2) == p2.first(2)) - { - return p1.first(3) < p2.first(3); - } - else - { - return p1.first(2) < p2.first(2); - } - } - else - { - return p1.first(1) < p2.first(1); - } - } - else - { - return p1.first(0) < p2.first(0); - } - } - - return (p1.second < p2.second); -} - - -TBrick::TBrick() - : State(CONST_BRICKSTATE_VISIBLE) - , StateTimer(0.f) - , Color(Vector4f(0.f, 0.f, 0.f, 1.f)) - , Locked(0) - , InitialLocked(0) -{ -} - -void TBrick::SetVisible(Vector4f color, int locked) -{ - State = CONST_BRICKSTATE_VISIBLE; - Color = color; - InitialLocked = locked; - Locked = InitialLocked; -} - -void TBrick::SetInvisible() -{ - State = CONST_BRICKSTATE_INVISIBLE; -} - -void TBrick::TryDrawAppear(int ipos, int jpos) -{ - *SE::Console << "TBrick::TryDrawAppear"; - Vector2f centerPos = GetPosFrom(ipos, jpos); - - Vector2f blockHalfSize = Vector2f(0.5f*CONST_BRICK_WIDTH, 0.5f*CONST_BRICK_HEIGHT); - - std::string texName; - if (Locked == 2) - { - texName = CONST_BLOCK_TEXTURE3; - } - else if (Locked == 1) - { - texName = CONST_BLOCK_TEXTURE2; - } - else - { - texName = CONST_BLOCK_TEXTURE1; - } - - if (State == CONST_BRICKSTATE_DISAPPEAR) - { - - RenderUniform1f("Transparency", StateTimer/CONST_BRICK_DISAPPEAR_TIME); - RenderUniform4fv("BrickColor", (Color.data())); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[texName]); - Renderer->DrawRect(centerPos - blockHalfSize, centerPos + blockHalfSize); - } - else if (State == CONST_BRICKSTATE_APPEAR) - { - - RenderUniform1f("Transparency", 1.f - StateTimer/CONST_BRICK_APPEAR_TIME); - RenderUniform4fv("BrickColor", Color.data()); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[texName]); - Renderer->DrawRect(centerPos - blockHalfSize, centerPos + blockHalfSize); - } -} - -void TBrick::Update(size_t dt) -{ - if (State == CONST_BRICKSTATE_DISAPPEAR) - { - *SE::Console << "TBrick::Update - CONST_BRICKSTATE_DISAPPEAR"; - StateTimer -= dt; - if (StateTimer < 0.f) - { - StateTimer = 0.f; - State = CONST_BRICKSTATE_INVISIBLE; - } - } - - if (State == CONST_BRICKSTATE_APPEAR) - { - *SE::Console << "TBrick::Update - CONST_BRICKSTATE_APPEAR"; - StateTimer -= dt; - if (StateTimer < 0.f) - { - StateTimer = 0.f; - State = CONST_BRICKSTATE_VISIBLE; - } - } -} - -Vector4f TBrick::GetColor() -{ - *SE::Console << "TBrick::GetColor"; - return Color; -} - -Vector2f TBrick::GetPosFrom(int ipos, int jpos) -{ - *SE::Console << "TBrick::GetPosFrom"; - const Vector2f BorderShift(CONST_BRICK_SHIFT_X, CONST_BRICK_SHIFT_Y); - - return BorderShift+Vector2f(CONST_BRICK_WIDTH*ipos + 0.5f*CONST_BRICK_WIDTH, 320.f - CONST_BRICK_HEIGHT*(jpos)-0.5f*CONST_BRICK_HEIGHT); - -} - -void TBrick::Disappear() -{ - *SE::Console << "TBrick::Disappear"; - StateTimer = CONST_BRICK_DISAPPEAR_TIME; - State = CONST_BRICKSTATE_DISAPPEAR; -} - -void TBrick::Hit() -{ - if (Locked == 0) - { - *SE::Console << "TBrick::Hit == 0"; - Disappear(); - } - else - { - *SE::Console << "TBrick::Hit else"; - Locked--; - } -} - -void TBrick::Appear(Vector4f color, int locked) -{ - *SE::Console << "TBrick::Appear"; - StateTimer = CONST_BRICK_APPEAR_TIME; - State = CONST_BRICKSTATE_APPEAR; - Color = color; - InitialLocked = locked; - Locked = InitialLocked; -} - -void TBrick::Appear() -{ - *SE::Console << "TBrick::Appear"; - Appear(Color, InitialLocked); -} - -int TBrick::GetLocked() -{ - *SE::Console << "TBrick::GetLocked"; - return Locked; -} - -bool TBrick::CanReact() -{ - *SE::Console << "TBrick::CanReact"; - return (State == CONST_BRICKSTATE_VISIBLE) || (State == CONST_BRICKSTATE_APPEAR); -} - -//=========================================== -//=========================================== -//=========================================== - -TBonusFalling::TBonusFalling(Vector2f pos) - : BonusType(rand() % 3) - , Pos(pos) - , Lifetime(0.f) -{ - - if (BonusType == 0) - { - TexName = CONST_BONUS_MULTIPLIER_TEXTURE; - } - - if (BonusType == 1) - { - TexName = CONST_BONUS_GOTHROUGH_TEXTURE; - } - - if (BonusType == 2) - { - TexName = CONST_BONUS_FLOOR_TEXTURE; - } - -} - -Vector2f TBonusFalling::GetPos() -{ - *SE::Console << "TBrick::GetPos"; - return Pos; -} - -int TBonusFalling::GetType() -{ - *SE::Console << "TBonusFalling::GetType"; - return BonusType; -} - - -void TBonusFalling::Draw() -{ - *SE::Console << "TBonusFalling::Draw"; - Vector2f BonusHalfSize = Vector2f(16.f, 16.f); - - float transparency = min_t(Lifetime/CONST_BONUS_APPEAR_TIME , 1.f); - - RenderUniform4fv("BrickColor", Vector4f(1.0f, 1.0f, 1.0f, 1.0f).data()); - RenderUniform1f("Transparency", transparency); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[TexName]); - Renderer->DrawRect(Pos - BonusHalfSize, Pos + BonusHalfSize); - -} - - -void TBonusFalling::Update(size_t dt) -{ - *SE::Console << "TBonusFalling::Update"; - Lifetime += dt; - Pos(1) -= dt * CONST_BONUS_FALL_SPEED / 1000.f; -} - -//=========================================== -//=========================================== -//=========================================== - - -TBall::TBall(Vector2f pos, Vector2f velocity, Vector4f color) - : Pos(pos) - , Velocity(velocity) - , Color(color) -{ - //must be 5 - TalePos.push_back(Pos); - TalePos.push_back(Pos); - TalePos.push_back(Pos); - TalePos.push_back(Pos); - TalePos.push_back(Pos); -} - -Vector2f TBall::GetPos() -{ - *SE::Console << "TBall::GetPos"; - return Pos; -} - -Vector2f TBall::GetVelocityVector() -{ - *SE::Console << "TBall::GetVelocityVector"; - return Velocity; -} - -void TBall::Go() -{ - *SE::Console << "TBall::Go"; -// Velocity = Normalize(Vector2f(2.f, 1.f)); - Velocity = Vector2f(2.f, 1.f).normalized(); -} - -void TBall::ReflectToLeft() -{ - *SE::Console << "TBall::ReflectToLeft"; - if (Velocity(0) > 0.f) - { - Velocity(0) = - Velocity(0); - } -} - -void TBall::ReflectToRight() -{ - *SE::Console << "TBall::ReflectToRight"; - if (Velocity(0) < 0.f) - { - Velocity(0) = - Velocity(0); - } -} - -void TBall::ReflectToUp() -{ - *SE::Console << "TBall::ReflectToUp"; - if (Velocity(1) < 0.f) - { - Velocity(1) = - Velocity(1); - } -} - -void TBall::ReflectToDown() -{ - *SE::Console << "TBall::ReflectToDown"; - if (Velocity(1) > 0.f) - { - Velocity(1) = - Velocity(1); - } -} - -//function for reflector surface. -float ReflectorPlaneFunction(float shift) -{ - *SE::Console << "ReflectorPlaneFunction(float shift)"; - /* _______ - / \ - | | - Something like this - - */ - - if (shift>=-70.f && shift < -40.f) - { - float t = (shift+70.f)/30.f; //0 to 1 - return 9.f + 21.f * t; - } - - if (shift>=-40.f && shift < 40.f) - { - return 30.f; - } - - - if (shift >= 40.f && shift <= 70.f) - { - float t = (70.f - shift)/30.f; //1 to 0 - return 9.f + 21.f * t; - } - - return 0.f; -} - -void TBall::TryReflectOnReflector(Vector2f refPos) -{ - *SE::Console << "TBall::TryReflectOnReflector(Vector2f refPos)"; - const float reflectionShiftY = 13.f; - const float reflectionMaxHeight = 30.f; - - - - if ((Pos(1) < reflectionMaxHeight + reflectionShiftY) && Pos(1) > 0.0f && Velocity(1) < 0) - { - float dy = ReflectorPlaneFunction(Pos(0) - refPos(0)); - - if (dy > 0 && (dy + reflectionShiftY > Pos(1))) - { - float shift = (Pos(0) - refPos(0)) / 128.f; - shift = min_t(shift, 0.5f); - shift = max_t(shift, -0.5f); - //Vector2f n = Normalize(Vector2f(shift, 1.0f)); - Vector2f n = Vector2f(shift, 1.0f).normalized(); - - Velocity = Velocity - n * 2.f * (Velocity(0)*n(0) + Velocity(1)*n(1)); - if ((Velocity(1) <= 0) || (fabs(Velocity(0)/Velocity(1)) > 4.f)) - { - Velocity(0) = 4.f*sign(Velocity(0)); - Velocity(1) = 1.f; - //Velocity = Normalize(Velocity); - Velocity = Velocity.normalized(); - } - } - } -} - - -void TBall::Update(size_t dt) -{ - *SE::Console << "TBall::Update(size_t dt)"; - Pos += Velocity * (CONST_BALL_VELOCITY * dt / 1000.f); - - TalePos.push_back(Pos); - - if (TalePos.size() > 4) - { - TalePos.erase(TalePos.begin()); - } -} - -//=========================================== -//=========================================== -//=========================================== - - -TGameLevel::TGameLevel() -{ - *SE::Console << "TGameLevel::TGameLevel"; - BkgTexture = "bkg"; - - RenderBufferReady = false; - PrevLevelStateIsStandby = false; - - OutScale = 1.f; - OutScaleVelocity = 0.f; - - StateTimer = 0.f; - - LevelState = CONST_LEVELSTATE_NODRAW; - - BallColor = Vector4f(0.2f, 0.8f, 1.0f, 1.0f); - - BonusFloorPosY = 0.f; - -} - -TGameLevel::~TGameLevel() -{ -} - - - -void TGameLevel::ReloadBlockInstansingList() -{ - *SE::Console << "TGameLevel::ReloadBlockInstansingList"; - std::map ConstTextureBlockMap = boost::assign::map_list_of (0,CONST_BLOCK_TEXTURE1) (1,CONST_BLOCK_TEXTURE2) (2,CONST_BLOCK_TEXTURE3); - - std::pair tempPair; - BlockInstansingList.ColorBlockList.clear(); - - for (int i=0; i>::iterator itr = BlockInstansingList.ColorBlockList.end(); - - for (auto b = BlockInstansingList.ColorBlockList.begin(); b != BlockInstansingList.ColorBlockList.end(); ++b) - { - if (b->first == tempPair) - { - itr = b; - } - } - - if (itr == BlockInstansingList.ColorBlockList.end()) - { - BlockInstansingList.ColorBlockList.push_back(std::pair(tempPair, TTriangleList())); - itr = BlockInstansingList.ColorBlockList.end(); - - itr--; - } - - Vector2f posFrom = BlockMatrix[i][j].GetPosFrom(i,j) + Vector2f(-0.5f*CONST_BRICK_WIDTH, -0.5f*CONST_BRICK_HEIGHT); - Vector2f posTo = BlockMatrix[i][j].GetPosFrom(i,j) + Vector2f(+0.5f*CONST_BRICK_WIDTH, +0.5f*CONST_BRICK_HEIGHT); - - itr->second.Data += MakeDataTriangleList(posFrom, posTo); - - } - } - } - - for (auto it = BlockInstansingList.ColorBlockList.begin(); it != BlockInstansingList.ColorBlockList.end(); ++it) - { - it->second.RefreshBuffer(); - } - -} - -Vector2f TGameLevel::GetBlock(const Vector2f& pos) -{ - *SE::Console << "TGameLevel::GetBlock"; - int x = static_cast((pos(0) - CONST_BRICK_SHIFT_X) / CONST_BRICK_WIDTH); - int y = static_cast((320.0f + CONST_BRICK_SHIFT_Y - pos(1)) / CONST_BRICK_HEIGHT); - - if (x < 0) - x = 0; - - if (x > CONST_BRICKMATRIX_WIDTH-1) - x = CONST_BRICKMATRIX_WIDTH-1; - - if (y < 0) - y = 0; - - if (y > CONST_BRICKMATRIX_HEIGHT-1) - y = CONST_BRICKMATRIX_HEIGHT-1; - - return Vector2f(x, y); -} - -bool TGameLevel::TapInBackBtnArea(const Vector2f& pos) -{ - *SE::Console << "TGameLevel::TapInBackBtnArea"; - return (pos(1) > 320.f - 64.f) && (pos(0)>=240.f-75.f) && (pos(0)<=240.f+75.f); -} - -void TGameLevel::SetFinishFreeze() -{ - *SE::Console << "TGameLevel::SetFinishFreeze"; - StateTimer = CONST_FINISH_FREEZE_TIME; - - LevelState = CONST_LEVELSTATE_FINISH_FREEZE; - -} - -void TGameLevel::SetFinished() -{ - *SE::Console << "TGameLevel::SetFinished"; - StateTimer = CONST_FINISHING_TIME; - - LevelState = CONST_LEVELSTATE_FINISHED; - - OutScale = 1.f; -} - -Vector4f TGameLevel::ParseColor(const std::string& s) -{ - *SE::Console << "TGameLevel::ParseColor"; - Vector4f r; - std::string ss(s); - - int i = ss.find(", "); - int c = toint(ss.substr(0, i)); - ss.erase(0, i+2); - r(0) = c / 255.f; - - i = ss.find(", "); - c = toint(ss.substr(0, i)); - ss.erase(0, i+2); - r(1) = c / 255.f; - - i = ss.find(", "); - c = toint(ss.substr(0, i)); - ss.erase(0, i+2); - r(2) = c / 255.f; - - //c = toint(ss); - //r(3) = c / 255.f; - i = ss.find("\r"); - c = toint(ss.substr(0, i)); - ss.erase(0, i + 2); - r(3) = c / 255.f; - - return r; -} - -void TGameLevel::ReloadLevel() -{ - *SE::Console << "TGameLevel::ReloadLevel"; - size_t byteCount; - boost::shared_array file = CreateMemFromFile(LevelFileName, byteCount); - std::string fileString(&file[0]); - char c; - //int n = 0; - - - std::vector rows; - int rowLen; - while (fileString.size() > 0) - { - rowLen = fileString.find(SE::fendl); - rows.push_back(fileString.substr(0, rowLen)); - fileString.erase(0, rowLen+2); - } - - std::vector::iterator rowIterator = rows.begin(); - BallColor = ParseColor(*rowIterator); - ++rowIterator; - - std::vector colors; - - Vector4f tc; - - while (*rowIterator != "Colormap") - { - tc = ParseColor(*rowIterator); - colors.push_back(tc); - ++rowIterator; - } - - std::vector::iterator rowColorIterator; - std::vector::iterator rowLockIterator; - - rowColorIterator = rowIterator + 1; - - rowLockIterator = rowColorIterator + 14; - - - - for (int j=0; jBallInBlock = GetBlock(ballPos); - BallList.begin()->PrevBallInBlock = BallList.begin()->BallInBlock; - - BonusGothroughTimer = 0.f; - BonusFloorTimer = 0.f; - - BonusFallingList.clear(); - - RenderBufferReady = false; - - ReloadBallInstancingList(); - - BonusFloorPosY = 0.f; - -} - -bool TGameLevel::IsLoaded() -{ - *SE::Console << "TGameLevel::IsLoaded" ; - return (LevelState == CONST_LEVELSTATE_STANDBY); -} - -void TGameLevel::Draw() -{ - *SE::Console << "TGameLevel::Draw"; - if (LevelState == CONST_LEVELSTATE_NODRAW) - { - CheckGlError(); - return; - } - - if (LevelState == CONST_LEVELSTATE_LOADING) - { - Renderer->PushMatrix(); - float scale = 1.f - 0.5f*StateTimer/CONST_TIMER_LOADING; - if (scale < 0.5f) - scale = 0.5f; - - if (scale > 1.f) - scale = 1.f; - - Renderer->TranslateMatrix(Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - Renderer->ScaleMatrix(scale); - Renderer->TranslateMatrix(-Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[LevelScreenTexture]); - Renderer->DrawRect(Vector2f(0, 0), Vector2f(480.f, 320.f)); - Renderer->PopMatrix(); - CheckGlError(); - return; - } - - - bool mustShowButtons = ((LevelState == CONST_LEVELSTATE_PAUSE) || (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE)); - - bool pause = (mustShowButtons || (LevelState == CONST_LEVELSTATE_FINISHED)); - - - bool renderBufferReady = RenderBufferReady; - - if (pause && renderBufferReady) - { - - //See also below (same method) - Renderer->PushMatrix(); - Renderer->TranslateMatrix(Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - Renderer->ScaleMatrix(OutScale); - Renderer->TranslateMatrix(-Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - DrawBuffer(); - - if (mustShowButtons) - { - DrawPauseButtons(); - } - Renderer->PopMatrix(); - CheckGlError(); - return; - } - - if (pause && !renderBufferReady) - { - - Renderer->SwitchToFrameBuffer("LevelBuffer"); - Renderer->SetProjectionMatrix(480.f, 320.f); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - CheckGlError(); - } - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[BkgTexture]); - Renderer->DrawRect(Vector2f(0, 0), Vector2f(480.f, 320.f)); - - std::list::iterator iBall; - - Renderer->PushShader("BrickShader"); - - - for (int i=0; i>::iterator colorBlockIterator; - for (colorBlockIterator = BlockInstansingList.ColorBlockList.begin(); colorBlockIterator != BlockInstansingList.ColorBlockList.end(); ++colorBlockIterator) - { - RenderUniform4fv("BrickColor", colorBlockIterator->first.first.data()); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[colorBlockIterator->first.second]); - - Renderer->DrawTriangleList(colorBlockIterator->second); - } - - std::list::iterator iBonus; - - for (iBonus = BonusFallingList.begin(); iBonus != BonusFallingList.end(); ++iBonus) - { - iBonus->Draw(); - } - - DrawBallInstancingList(); - - Renderer->PopShader(); - - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_REFLECTOR_TEXTURE]); - Renderer->DrawRect(Vector2f(-128.f, -16.f)+ReflectorPos, Vector2f(128.f, 16.f)+ReflectorPos); - - - const Vector2f wallUpPos1(240.f-256.f, 320.f-64.f); - const Vector2f wallUpPos2(240.f+256.f, 320.f); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_UP_TEXTURE]); - Renderer->DrawRect(wallUpPos1, wallUpPos2); - - const Vector2f wallLeftPos1(0.f, 320.f - 512.f); - const Vector2f wallLeftPos2(32.f, 320.f); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_LEFT_TEXTURE]); - Renderer->DrawRect(wallLeftPos1, wallLeftPos2); - - const Vector2f wallRightPos1(480.f-32.f, 320.f - 512.f); - const Vector2f wallRightPos2(480.f, 320.f); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_RIGHT_TEXTURE]); - Renderer->DrawRect(wallRightPos1, wallRightPos2); - - - if (BonusFloorTimer>0.f) - { - - const Vector2f wallDownPos(240.f, BonusFloorPosY); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_BONUS_TEXTURE]); - - Renderer->DrawRect(Vector2f(-256.f, -16.f)+wallDownPos, Vector2f(256.f, 16.f)+wallDownPos); - } - - - if (!pause) - { - RenderUniform1f("Transparency", 1.f); - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BACK_BTN_TEXTURE]); - const Vector2f BackBtnPos(240.f, 320.f - 32.f - 20.f); - Renderer->DrawRect(Vector2f(-128.f, -32.f)+BackBtnPos, Vector2f(128.f, 32.f)+BackBtnPos); - } - - if (pause && !renderBufferReady) - { - - //ololo - //See also above (same method) - Renderer->SwitchToScreen(); - Renderer->SetFullScreenViewport(); - - Renderer->PushMatrix(); - //Renderer->LoadIdentity(); - Renderer->TranslateMatrix(Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - Renderer->ScaleMatrix(OutScale); - Renderer->TranslateMatrix(-Vector3f(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); - DrawBuffer(); - if (mustShowButtons) - { - DrawPauseButtons(); - } - Renderer->PopMatrix(); - RenderBufferReady = true; - CheckGlError(); - } - CheckGlError(); -} - -void TGameLevel::DrawPauseButtons() -{ - *SE::Console << "TGameLevel::DrawPauseButtons"; - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_SLIDE_UP_BTN_TEXTURE]); - Renderer->DrawRect(Vector2f(-128.f, -64.f)+CONST_SLIDE_UP_POS, Vector2f(128.f, 64.f)+CONST_SLIDE_UP_POS); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_TAP_TO_CONTINUE_BTN_TEXTURE]); - Renderer->DrawRect(Vector2f(-128.f, -128.f)+CONST_TAP_TO_CONTINUE_POS, Vector2f(128.f, 128.f)+CONST_TAP_TO_CONTINUE_POS); - -} - -void TGameLevel::DrawBallInstancingList() -{ - *SE::Console << "TGameLevel::DrawBallInstancingList"; - RenderUniform1f("Transparency", 1.f); - RenderUniform4fv("BrickColor", BallColor.data()); - - if (BonusGothroughTimer > 0.f) - { - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BALLGLOW_TEXTURE]); - - Renderer->DrawTriangleList(BallInstancingList.BallAndGlowList[1]); - } - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BALL_TEXTURE]); - - Renderer->DrawTriangleList(BallInstancingList.BallAndGlowList[0]); - -} - -void TGameLevel::DrawBuffer() -{ - *SE::Console << "TGameLevel::DrawBuffer"; - Renderer->PushShader("FrameShader"); - float brightness; - if (CONST_LEVELSTATE_GO_TO_PAUSE) - { - brightness = 0.3f + 0.7f * StateTimer / CONST_PAUSE_APPEAR_TIME; - } - else - { - brightness = 0.3f; - } - - RenderUniform1f("Brightness", brightness); - glBindTexture(GL_TEXTURE_2D,ResourceManager->FrameManager.GetFrameTexture("LevelBuffer")); - - //Matrix switched to identity - //Vector2f RectPos = Vector2f(-1, -1); - //Vector2f RectSize = Vector2f(2, 2); - Vector2f RectPos = Vector2f(240.f, 160.f); - Vector2f RectSize = Vector2f(240.f, 160.f); - - Renderer->DrawRect(RectPos-RectSize, RectPos+RectSize); - - Renderer->PopShader(); - - CheckGlError(); -} - -void TGameLevel::SetPause() -{ - *SE::Console << "TGameLevel::SetPause"; - OutScaleVelocity = 0.f; - OutScale = 1.f; - RenderBufferReady = false; - LevelState = CONST_LEVELSTATE_GO_TO_PAUSE; - StateTimer = CONST_PAUSE_APPEAR_TIME; - Application->MarkSetGameLevelPause(); -} - -void TGameLevel::ReleasePause() -{ - *SE::Console << "TGameLevel::ReleasePause"; - RenderBufferReady = false; - - if (PrevLevelStateIsStandby) - { - LevelState = CONST_LEVELSTATE_STANDBY; - PrevLevelStateIsStandby = false; - } - else - { - LevelState = CONST_LEVELSTATE_PLAYING; - } - Application->MarkReleaseGameLevelPause(); -} - -bool TGameLevel::IsPaused() -{ - *SE::Console << "TGameLevel::IsPaused"; - return ((LevelState == CONST_LEVELSTATE_PAUSE) || (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE) || (LevelState == CONST_LEVELSTATE_FINISHED)); -} - -void TGameLevel::Update(size_t dt) -{ - *SE::Console << "TGameLevel::Update"; - if (LevelState == CONST_LEVELSTATE_NODRAW) - { - return; - } - - if (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE) - { - StateTimer -= dt; - if (StateTimer <= 0.f) - { - StateTimer = 0.f; - LevelState = CONST_LEVELSTATE_PAUSE; - } - - return; - } - - if (LevelState == CONST_LEVELSTATE_PAUSE) - { - OutScale += OutScaleVelocity * dt; - TryGoToMenu(); - CheckGlError(); - return; - } - - if (LevelState == CONST_LEVELSTATE_FINISHED) - { - StateTimer -= dt; - - OutScale = StateTimer/CONST_FINISHING_TIME; - - if (StateTimer <= 0.f) - { - TryGoToMenu(); - } - CheckGlError(); - return; - } - - - if (LevelState == CONST_LEVELSTATE_LOADING) - { - StateTimer -= dt; - if (StateTimer <= 0.f) - { - StateTimer = 0.f; - RenderBufferReady = false; - LevelState = CONST_LEVELSTATE_STANDBY; - } - } - - if (LevelState == CONST_LEVELSTATE_FINISH_FREEZE) - { - StateTimer -= dt; - - if (StateTimer <= 0.f) - { - SetFinished(); - CheckGlError(); - return; - } - - //To make the whole scene like freeze - dt = static_cast(dt / max_t((CONST_FINISH_FREEZE_TIME-StateTimer)/100.f, 1.f)); - - } - - if (BonusGothroughTimer > 0.f) - { - BonusGothroughTimer -= dt; - BonusGothroughTimer = max_t(BonusGothroughTimer, 0.f); - } - - if (BonusFloorTimer > 0.f) - { - BonusFloorTimer -= dt; - BonusFloorTimer = max_t(BonusFloorTimer, 0.f); - } - - UpdateBallList(dt); - - - for (int i=0; i::iterator iBonus = BonusFallingList.begin(); - - while (iBonus != BonusFallingList.end()) - { - iBonus->Update(dt); - - if ((fabs(ReflectorPos(0) - iBonus->GetPos()(0))GetPos()(1))GetType(); - iBonus = BonusFallingList.erase(iBonus); - - - if (bonusType == CONST_BONUS_TYPE_GOTHROUGH) - { - BonusGothroughTimer = CONST_BONUS_GOTHROUGH_TIME; - } - else if (bonusType == CONST_BONUS_TYPE_MULTIPLIER) - { - Vector2f pos = BallList.begin()->GetPos(); - Vector2f velocity = BallList.begin()->GetVelocityVector(); - MultiplyBalls(pos, velocity); - } - else if (bonusType == CONST_BONUS_TYPE_FLOOR) - { - BonusFloorTimer = CONST_BONUS_FLOOR_TIME; - } - - } - else if (iBonus->GetPos()(1) < -15.f) - { - iBonus = BonusFallingList.erase(iBonus); - } - - if (iBonus != BonusFallingList.end()) - { - ++iBonus; - } - } - - //Bonus floor pos - if (BonusFloorTimer/CONST_BONUS_GOTHROUGH_TIME < 0.2f) - { - //Bonus must go down until 0.f - if (BonusFloorPosY > 0.f) - { - BonusFloorPosY -= CONST_BONUS_FLOOR_APPEAR_SPEED * dt / 1000.f; - BonusFloorPosY = max_t(BonusFloorPosY, 0.f); - } - - } - else - { - //Bonus must go up until 16.f - if (BonusFloorPosY < 16.f) - { - BonusFloorPosY += CONST_BONUS_FLOOR_APPEAR_SPEED * dt / 1000.f; - BonusFloorPosY = min_t(BonusFloorPosY, 16.f); - } - } - - - bool noMoreBlocks = true; - - for (int i=0; iOpenNextLevel(); - Application->MarkSetGameLevelPause(); - SetFinishFreeze(); - CheckGlError(); - - } - - if (BallList.size() == 0 && LevelState != CONST_LEVELSTATE_FINISH_FREEZE) - { - SetStandBy(); - } - -} - - - -void TGameLevel::ReloadBallInstancingList() -{ - *SE::Console << "TGameLevel::ReloadBallInstancingList"; - //Changing this function? Don't forget to change next one! - - BallInstancingList.BallAndGlowList.clear(); - - std::list::iterator i; - /* - Vector3f p1; - Vector3f p2; - Vector3f p3; - Vector3f p4; - - Vector2f t1 = Vector2f(0.0f, 0.0f); - Vector2f t2 = Vector2f(0.0f, 1.0f); - Vector2f t3 = Vector2f(1.0f, 1.0f); - Vector2f t4 = Vector2f(1.0f, 0.0f); - */ - - - for (i = BallList.begin(); i != BallList.end(); ++i) - { - /* - p1 = Vector3f(i->Pos, 0.f) + Vector3f(-8.f, -8.f, 0.f); - p2 = Vector3f(i->Pos, 0.f) + Vector3f(-8.f, +8.f, 0.f); - p3 = Vector3f(i->Pos, 0.f) + Vector3f(+8.f, +8.f, 0.f); - p4 = Vector3f(i->Pos, 0.f) + Vector3f(+8.f, -8.f, 0.f); - - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p2); - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); - - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p4); - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); - - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t2); - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); - - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t4); - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); - */ - - BallInstancingList.BallAndGlowList[0].Data += MakeDataTriangleList(i->Pos + Vector2f(-8.f, -8.f), i->Pos + Vector2f(8.f, 8.f)); - - //Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[0].Data, n, i->Pos + Vector2f(-8.f, -8.f), i->Pos + Vector2f(8.f, 8.f)); - - //n += 6; - } - - std::list::iterator j; - - for (i = BallList.begin(); i != BallList.end(); ++i) - { - for (j = i->TalePos.begin(); j != i->TalePos.end(); ++j) - { - /* - p1 = Vector3f(*j, 0.f) + Vector3f(-16.f, -16.f, 0.f); - p2 = Vector3f(*j, 0.f) + Vector3f(-16.f, +16.f, 0.f); - p3 = Vector3f(*j, 0.f) + Vector3f(+16.f, +16.f, 0.f); - p4 = Vector3f(*j, 0.f) + Vector3f(+16.f, -16.f, 0.f); - - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p2); - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); - - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p4); - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); - - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t2); - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); - - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t4); - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); - */ - BallInstancingList.BallAndGlowList[1].Data += MakeDataTriangleList(*j + Vector2f(-16.f, -16.f), *j + Vector2f(16.f, 16.f)); - //Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[1].Data, n, *j + Vector2f(-16.f, -16.f), *j + Vector2f(16.f, 16.f)); - - //n += 6; - } - } - - //std::map::iterator it; - - auto it = BallInstancingList.BallAndGlowList.begin(); - - for (; it != BallInstancingList.BallAndGlowList.end(); ++it) - //for (auto it = BallInstancingList.BallAndGlowList.begin(); it != BallInstancingList.BallAndGlowList.end(); ++it) - - { - it->second.RefreshBuffer(); - } - -} - -void TGameLevel::RefreshBallInstancingList() -{ - *SE::Console << "TGameLevel::RefreshBallInstancingList"; - //Changing this function? Don't forget to change previous one! - /* - Vector3f p1; - Vector3f p2; - Vector3f p3; - Vector3f p4; - - Vector2f t1 = Vector2f(0.0f, 0.0f); - Vector2f t2 = Vector2f(0.0f, 1.0f); - Vector2f t3 = Vector2f(1.0f, 1.0f); - Vector2f t4 = Vector2f(1.0f, 0.0f); - */ - int n = 0; - int m = 0; - - std::list::iterator i; - - for (i = BallList.begin(); i != BallList.end(); ++i) - { - /* - p1 = Vector3f(i->Pos, 0.f) + Vector3f(-8.f, -8.f, 0.f); - p2 = Vector3f(i->Pos, 0.f) + Vector3f(-8.f, +8.f, 0.f); - p3 = Vector3f(i->Pos, 0.f) + Vector3f(+8.f, +8.f, 0.f); - p4 = Vector3f(i->Pos, 0.f) + Vector3f(+8.f, -8.f, 0.f); - - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p2; - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; - - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p4; - BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; - - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t2; - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; - - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t4; - BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; - */ - - Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[0].Data, n, i->Pos + Vector2f(-8.f, -8.f), i->Pos + Vector2f(8.f, 8.f)); - - n += 6; - } - - std::list::iterator j; - - n = 0; - m = 0; - - for (i = BallList.begin(); i != BallList.end(); ++i) - { - for (j = i->TalePos.begin(); j != i->TalePos.end(); ++j) - { - /* - p1 = Vector3f(*j, 0.f) + Vector3f(-16.f, -16.f, 0.f); - p2 = Vector3f(*j, 0.f) + Vector3f(-16.f, +16.f, 0.f); - p3 = Vector3f(*j, 0.f) + Vector3f(+16.f, +16.f, 0.f); - p4 = Vector3f(*j, 0.f) + Vector3f(+16.f, -16.f, 0.f); - - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p2; - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; - - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p4; - BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; - - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t2; - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; - - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t4; - BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1;*/ - //BallInstancingList.BallAndGlowList[1].Data += MakeDataTriangleList(); - - Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[1].Data, n, *j + Vector2f(-16.f, -16.f), *j + Vector2f(16.f, 16.f)); - - n += 6; - - } - } - - std::map::iterator it; - - for (it = BallInstancingList.BallAndGlowList.begin(); it != BallInstancingList.BallAndGlowList.end(); ++it) - { - it->second.RefreshBuffer(); - } - -} - - -void TGameLevel::UpdateBallList(size_t dt) -{ - *SE::Console << "TGameLevel::UpdateBallList"; - std::list::iterator iBall; - - bool mustReloadBalls = false; - - //If not loaded - force load - if (BallInstancingList.BallAndGlowList.size() == 0) - { - mustReloadBalls = true; - } - - if (BonusFloorTimer == 0.f) - { - Vector2f ballPos; - - iBall = BallList.begin(); - - while (iBall != BallList.end()) - { - ballPos = iBall->GetPos(); - - if (ballPos(1)<0.f) - { - iBall = BallList.erase(iBall); - mustReloadBalls = true; - } - - if (iBall != BallList.end()) - { - ++iBall; - } - } - - } - - bool blockListChanged = false; - - for (iBall = BallList.begin(); iBall != BallList.end(); ++iBall) - { - - - iBall->Update(dt); - - Vector2f ballPos = iBall->GetPos(); - - - if (ballPos(0) > 480.f-15.f) - { - iBall->ReflectToLeft(); - } - - if (ballPos(0) < 15.f) - { - iBall->ReflectToRight(); - } - - if (ballPos(1) > 320.0f-16.f) - { - iBall->ReflectToDown(); - } - - if (BonusFloorTimer > 0.f) - { - if (ballPos(1) < 13.0f) - { - iBall->ReflectToUp(); - } - } - - iBall->TryReflectOnReflector(ReflectorPos); - - Vector2f ipos = GetBlock(ballPos); - if (!(ipos == iBall->BallInBlock)) - { - iBall->PrevBallInBlock = iBall->BallInBlock; - iBall->BallInBlock = ipos; - - int i = static_cast(iBall->BallInBlock(0)); - int j = static_cast(iBall->BallInBlock(1)); - - int iprev = static_cast(iBall->PrevBallInBlock(0)); - int jprev = static_cast(iBall->PrevBallInBlock(1)); - - - if (BlockMatrix[i][j].CanReact()) - { - bool canThrowBonus; - - blockListChanged = true; - - if (BonusGothroughTimer > 0.f) - { - BlockMatrix[i][j].Disappear(); - canThrowBonus = true; - - } - else - { - canThrowBonus = (BlockMatrix[i][j].GetLocked() == 0); - - BlockMatrix[i][j].Hit(); - - } - - Vector2f blockPos = BlockMatrix[i][j].GetPosFrom(i, j); - - - if (canThrowBonus && rand() % 20 == 0) - { - BonusFallingList.push_back(TBonusFalling(blockPos)); - } - - - if (BonusGothroughTimer == 0.f) - { - if (j < jprev) - { - iBall->ReflectToDown(); - } - else - if (j > jprev) - { - iBall->ReflectToUp(); - } - else - if (i < iprev) - { - iBall->ReflectToRight(); - } - else - if (i > iprev) - { - iBall->ReflectToLeft(); - } - } - - - } - - } - - } - - if (blockListChanged) - { - ReloadBlockInstansingList(); - } - - if (mustReloadBalls) - { - ReloadBallInstancingList(); - } - else - { - RefreshBallInstancingList(); - } -} - -void TGameLevel::MultiplyBalls(Vector2f pos, Vector2f velocity) -{ - *SE::Console << "TGameLevel::MultiplyBalls"; - //mat2 r; - Matrix2f r; - Vector2f v; - - for (int i = -2; i<=2; i++) - { - - float alpha = i*pi / 4.f; - r(0, 0) = cosf(alpha); - r(1, 0) = sinf(alpha); - r(0, 1) = -sinf(alpha); - r(1, 1) = cosf(alpha); - - v = r*velocity; - - v(1) = max_t(static_cast(fabs(v(1))), 0.2f) * sign(v(1)); //Prevent velocityY from being ~= 0 - - BallList.push_back(TBall(pos, v, BallColor)); - } - - ReloadBallInstancingList(); -} - - -void TGameLevel::OnTapDown(Vector2f pos) -{ - *SE::Console << "TGameLevel::OnTapDown"; - if (LevelState == CONST_LEVELSTATE_STANDBY) - { - if (TapInBackBtnArea(pos)) - { - SetPause(); - PrevLevelStateIsStandby = true; - } - else - { - - LevelState = CONST_LEVELSTATE_PLAYING; - BallList.begin()->Go(); - } - } - else if (LevelState == CONST_LEVELSTATE_PLAYING) - { - - - if (TapInBackBtnArea(pos)) - { - SetPause(); - } - else if (fabs(ReflectorPos(0) - pos(0))>64.f) - { - ReflectorPos(0) = pos(0); - } - - } - else if (LevelState == CONST_LEVELSTATE_PAUSE) - { - if (pos(1) > 128.f) - { - ReleasePause(); - } - } -} - -void TGameLevel::OnTapUp(Vector2f pos) -{ - *SE::Console << "TGameLevel::OnTapUp"; -} - -void TGameLevel::OnFling(Vector2f slideSpeed) -{ - *SE::Console << "TBrick::TryDrawAppear"; - if (LevelState == CONST_LEVELSTATE_PAUSE) - { - OutScaleVelocity = slideSpeed(1)/320.f; - } -} - -void TGameLevel::OnScroll(Vector2f shift) -{ - *SE::Console << "TGameLevel::OnScroll"; - const float CONST_SCROLL_SCALE = 1.1f; - if (LevelState == CONST_LEVELSTATE_PLAYING || LevelState == CONST_LEVELSTATE_STANDBY) - { - ReflectorPos(0) -= CONST_SCROLL_SCALE*shift(0); - } - else if (LevelState == CONST_LEVELSTATE_PAUSE) - { - - - OutScale += shift(1)/320.f; - - TryGoToMenu(); - } -} - -void TGameLevel::TryGoToMenu() -{ - *SE::Console << "TGameLevel::TryGoToMenu"; - if (OutScale < 0.5f) - { - OutScale = 0.5f; - LevelState = CONST_LEVELSTATE_NODRAW; - Application->GoFromGameToMenu(); - } - if (OutScale > 1.f) - { - OutScale = 1.f; - } -} diff --git a/game/gamecode.h b/game/gamecode.h deleted file mode 100644 index b83f497..0000000 --- a/game/gamecode.h +++ /dev/null @@ -1,205 +0,0 @@ -#ifndef GAMECODE_H_INCLUDED -#define GAMECODE_H_INCLUDED - -#include "include/Engine.h" -#include "game_area_interface.h" - -#include - -using namespace SE; - - -const int CONST_BRICKSTATE_VISIBLE = 3; -const int CONST_BRICKSTATE_DISAPPEAR = 2; -const int CONST_BRICKSTATE_INVISIBLE = 1; -const int CONST_BRICKSTATE_APPEAR = 0; - -const float CONST_BRICK_DISAPPEAR_TIME = 200.f; -const float CONST_BRICK_APPEAR_TIME = 200.f; - -const int CONST_BRICKMATRIX_WIDTH = 12; -const int CONST_BRICKMATRIX_HEIGHT = 13; -const float CONST_BRICK_WIDTH = 37.5f; -const float CONST_BRICK_HEIGHT = 0.5f*CONST_BRICK_WIDTH; -const float CONST_BRICK_SHIFT_X = 15.f; -const float CONST_BRICK_SHIFT_Y = -16.f; - -const float CONST_BONUS_APPEAR_TIME = 400.f; -const float CONST_BONUS_FALL_SPEED = 100.f; -const float CONST_BONUS_GOTHROUGH_TIME = 8000.f; -const float CONST_BONUS_CATCH_DISTANCE_X = 65.f; -const float CONST_BONUS_CATCH_DISTANCE_Y = 20.f; - -const float CONST_BONUS_FLOOR_TIME = 8000.f; -const float CONST_BONUS_FLOOR_APPEAR_SPEED = 50.f; - -const int CONST_BONUS_TYPE_MULTIPLIER = 0; -const int CONST_BONUS_TYPE_GOTHROUGH = 1; -const int CONST_BONUS_TYPE_FLOOR = 2; - - -class TBrick -{ -protected: - int InitialLocked; - int Locked; //0, 1 or 2 - int State; - float StateTimer; - Vector4f Color; -public: - TBrick(); - void SetVisible(Vector4f color, int locked); - void SetInvisible(); - void TryDrawAppear(int ipos, int jpos); - void Update(size_t dt); - Vector2f GetPosFrom(int ipos, int jpos); - Vector4f GetColor(); - void Appear(Vector4f color, int locked); - void Appear(); - void Hit(); - void Disappear(); - int GetLocked(); - bool CanReact(); -}; - -class TBonusFalling -{ -protected: - float Lifetime; - Vector2f Pos; - std::string TexName; - int BonusType; //0 - multiplier, 1 - Go-through, 2 - floor -public: - TBonusFalling(Vector2f pos); - Vector2f GetPos(); - int GetType(); - void Draw(); - void Update(size_t dt); -}; - -struct TBall -{ - Vector2f Pos; - Vector2f Velocity; - Vector4f Color; - std::list TalePos; - - Vector2f BallInBlock; - Vector2f PrevBallInBlock; - - TBall(Vector2f pos, Vector2f velocity, Vector4f color); - Vector2f GetPos(); - Vector2f GetVelocityVector(); - - void Go(); - - void ReflectToLeft(); - void ReflectToRight(); - void ReflectToUp(); - void ReflectToDown(); - - void TryReflectOnReflector(Vector2f refPos); - - void Update(size_t dt); -}; - -typedef std::pair PairColorTexture; - -struct TBlockInstansingList -{ - //color-texture ---> and list of triangles for this color - std::list> ColorBlockList; -}; - - -struct TBallInstancingList -{ - std::map BallAndGlowList; -}; - -class TGameLevel : public TGameAreaAncestor -{ -protected: - std::string BkgTexture; - std::string LevelScreenTexture; - std::string LevelFileName; - - Vector2f ReflectorPos; - - int LevelState; - bool PrevLevelStateIsStandby; - float StateTimer; - - TBrick BlockMatrix[CONST_BRICKMATRIX_WIDTH][CONST_BRICKMATRIX_HEIGHT]; - TBlockInstansingList BlockInstansingList; - - bool TapInBackBtnArea(const Vector2f& pos); - - void ReloadBlockInstansingList(); - void SetFinished(); - void SetFinishFreeze(); - - void DrawBuffer(); - void DrawPauseButtons(); - - void DrawBallInstancingList(); - - bool RenderBufferReady; - - float OutScale; - - float OutScaleVelocity; - - void TryGoToMenu(); - - std::list BonusFallingList; - - std::list BallList; - - TBallInstancingList BallInstancingList; - - Vector4f BallColor; - - void ReloadBallInstancingList(); - void RefreshBallInstancingList(); - - - void UpdateBallList(size_t dt); - void MultiplyBalls(Vector2f pos, Vector2f velocity); - - Vector2f GetBlock(const Vector2f& pos); - void InitLevel(); - - float BonusGothroughTimer; - float BonusFloorTimer; - float BonusFloorPosY; - - Vector4f ParseColor(const std::string& s); - void ReloadLevel(); - -public: - TGameLevel(); - ~TGameLevel(); - - void FillWithFile(const std::string& filename); - - void SetStandBy(); - void SetLoading(const std::string& bkg, const std::string& levelscreen); - bool IsLoaded(); - - virtual void Draw(); - - void SetPause(); - bool IsPaused(); - void ReleasePause(); - - virtual void Update(size_t dt); - virtual void OnTapDown(Vector2f pos); - virtual void OnTapUp(Vector2f pos); - virtual void OnFling(Vector2f slideSpeed); - virtual void OnScroll(Vector2f shift); -}; - - - -#endif diff --git a/game/loadingcode.cpp b/game/loadingcode.cpp deleted file mode 100644 index 20a0b79..0000000 --- a/game/loadingcode.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "loadingcode.h" -#include "include/Engine.h" -#include "main_code.h" - -void TGameLoading::Draw() -{ - //*SE::Console << "TGameLoading::Draw"; - - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList[CONST_LOADING_BACKGROUND_BLACK]); - Renderer->DrawRect(Vector2f(0.f, 0.f), Vector2f(Renderer->GetMatrixWidth(), Renderer->GetMatrixHeight())); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOADING_TEXTURE]); - Renderer->DrawRect(Vector2f(240.f - 128.f, 10.f), Vector2f(240.f + 128.f, 10.f + 64.f)); - - glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOGO_SMALL_TEXTURE]); - Renderer->DrawRect(Vector2f(480.f - 256.f+50.f, 320.f - 64.f), Vector2f(480.f+50.f, 320.f)); - - CheckGlError(); - -} diff --git a/game/loadingcode.h b/game/loadingcode.h deleted file mode 100644 index 6ea2411..0000000 --- a/game/loadingcode.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef LOADINGCODE_H_INCLUDED -#define LOADINGCODE_H_INCLUDED - -#include "game_area_interface.h" - -using namespace SE; - -class TGameLoading : public TGameAreaAncestor -{ -public: - virtual void Draw(); -}; - - -#endif diff --git a/game/main_code — копиÑ.cpp b/game/main_code — копиÑ.cpp new file mode 100755 index 0000000..66e678d --- /dev/null +++ b/game/main_code — копиÑ.cpp @@ -0,0 +1,592 @@ +#include "main_code.h" + +#include +#include +#include +#include + +#include "include/Engine.h" + +#include "main_code.h" + + + + +FaceStruct::FaceStruct() +{ +} + +FaceStruct::FaceStruct(const std::array& fromPreds) +{ + ApplyPreds(fromPreds); + +} + +void FaceStruct::CalcFromPreds() +{ + float minX = preds[0](0); + float maxX = preds[0](0); + float minY = preds[0](1); + float maxY = preds[0](1); + float sumX = preds[0](0); + float sumY = preds[0](1); + + for (size_t i = 1; i < LANDMARK_POINT_COUNT; i++) + { + if (minX > preds[i](0)) + { + minX = preds[i](0); + } + + if (minY > preds[i](1)) + { + minY = preds[i](1); + } + + if (maxX < preds[i](0)) + { + maxX = preds[i](0); + } + + if (maxY < preds[i](1)) + { + maxY = preds[i](1); + } + + sumX += preds[i](0); + sumY += preds[i](1); + } + + float avgX = sumX / static_cast(LANDMARK_POINT_COUNT); + float avgY = sumY / static_cast(LANDMARK_POINT_COUNT); + + + + center = { avgX, avgY }; + size = { maxX- minX,maxY - minY }; + + //center = { centerXSmoother.responsiveAnalogReadSimple(avgX), centerYSmoother.responsiveAnalogReadSimple(avgY) }; + //size = { sizeWidthSmoother.responsiveAnalogReadSimple(maxX- minX), sizeHeightSmoother.responsiveAnalogReadSimple(maxY - minY) }; +} + +void FaceStruct::ApplyPreds(const std::array& fromPreds) +{ + InnerApplyPreds(fromPreds); + CalcFromPreds(); + + /* + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = preds[i] - center; + + } + + + historicalPreds.push_back(preds); + if (historicalPreds.size() > 4) + { + historicalPreds.erase(historicalPreds.begin()); + } + + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = { 0.f, 0.f }; + for (size_t x = 0; x < historicalPreds.size(); x++) + { + preds[i] += historicalPreds[x][i]; + } + + preds[i] = preds[i] / static_cast(historicalPreds.size()); + } + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = preds[i] + center; + }*/ +} + +void FaceStruct::InnerApplyPreds(const std::array& fromPreds) +{ + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = { fromPreds[i].x, 720 - fromPreds[i].y}; + + } +} + + + + +cv::VideoCapture cap; + +FaceLandmarkDetector faceLandmarkDetector; + +GLuint lastFrameTexture; + + +std::array faceLandmarkArr; + +cv::Mat frame; + +std::vector frameArr; + +int currentIndex = -1; +int lastProcessedIndex = 0; +int lineShift = 0; + +int prevPassedIndex = 0; + +int indexStep = 0; + +std::array faceStruct; + + +const std::string CONST_LOADING_BACKGROUND_BLACK = "loading_background_black"; + + +TMyApplication* Application; + + +void TMyApplication::InnerInit() +{ + + Application = this; + +#ifdef TARGET_WIN32 +#ifdef NDEBUG + //ST::PathToResources = "resources/"; + ST::PathToResources = "../../../assets/"; +#else + ST::PathToResources = "../../../assets/"; +#endif +#endif + +#ifdef TARGET_IOS + ST::PathToResources = "assets/"; +#endif + + if (Console != NULL) + { + *Console<<"APP INIT\n"; + } + srand (static_cast(time(NULL))); + + ResourceManager->ShaderManager.AddShader("DefaultShader", "shader1vertex.txt", "shader1fragment.txt"); + ResourceManager->ShaderManager.AddShader("FrameShader", "frameshader_vertex.txt", "frameshader_fragment.txt"); + Renderer->PushShader("DefaultShader"); + + ResourceManager->TexList.AddTexture(CONST_LOADING_BACKGROUND_BLACK + ".png", CONST_LOADING_BACKGROUND_BLACK); + + + auto texid = ResourceManager->TexList.AddTexture("emoji/Asset 3@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 4@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 5@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 6@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 7@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 8@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 9@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 10@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 11@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 13@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 14@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 15@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 16@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 17@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 18@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 19@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 20@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 21@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 22@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 23@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 24@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 25@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 26@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 27@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 28@20x.png"); + + + ResourceManager->FontManager.AddFont("droid_sans14", "droid_sans14_font_bitmap.png", "droid_sans14_font_charmap.txt"); + ResourceManager->FontManager.PushFont("droid_sans14"); + + + lastFrameTexture = ResourceManager->TexList.AddEmptyTexture("lastFrameTexture", 1280, 720); + + Renderer->SetOrthoProjection(); + + Renderer->SetFullScreenViewport(); + + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + faceRenderPair[i].first.SamplerMap[CONST_STRING_TEXTURE_UNIFORM] = "Asset "+boost::lexical_cast(i+3)+"@20x.png"; + + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 0, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 0, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 0, 0)); + + + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 0)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 0)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 0)); + faceRenderPair[i].second.RefreshBuffer(); + } + + + cap = cv::VideoCapture(0); + //cap = cv::VideoCapture("video.mp4"); + //cap = cv::VideoCapture("bp.mp4"); + + + // Check if camera opened successfully + if (!cap.isOpened()) { + std::cout << "Error opening video stream or file" << std::endl; + } + + cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); + cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); + + + + faceLandmarkDetector.StartTrackProcess(); + + Inited = true; + + + + +} + +void TMyApplication::InnerDeinit() +{ + + faceLandmarkDetector.StopTrackProcess(); + cap.release(); + + Inited = false; + + if (Console != NULL) + { + *Console<<"APP DEINIT\n"; + } + + +} + +void TMyApplication::InnerOnTapDown(Vector2f p) +{ + +} + +void TMyApplication::InnerOnTapUp(Vector2f p) +{ + +} + +void TMyApplication::InnerOnTapUpAfterMove(Vector2f p) +{ + +} + +void TMyApplication::InnerOnMove(Vector2f p, Vector2f shift) +{ + +} + +void TMyApplication::OnFling(Vector2f v) +{ +} + + + +void TMyApplication::InnerDraw() +{ + glDisable(GL_DEPTH_TEST); + + + + //glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList[CONST_LOADING_BACKGROUND_BLACK]); + glBindTexture(GL_TEXTURE_2D, lastFrameTexture); + Renderer->DrawRect(Vector2f(0.f, 0.f), Vector2f(Renderer->GetMatrixWidth(), Renderer->GetMatrixHeight())); + + + /* + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + TRenderParamsSetter params(faceRenderPair[i].first); + Renderer->DrawTriangleList(faceRenderPair[i].second); + }*/ + + + + +} + + +void TMyApplication::InnerUpdate(size_t dt) +{ + + + /*cap >> lastFrame; + + if (lastFrame.empty()) + { + return; + } + + + faceLandmarkTracker.HandleOneFrame(lastFrame, localInputStructArr, localFaceShift, localOutputStructArr); + + + + high_resolution_clock::time_point t2 = high_resolution_clock::now(); + + auto duration = duration_cast(t2 - FaceLandmarkTracker::lastTimePoint).count(); + + FaceLandmarkTracker::lastTimePoint = t2; + + std::stringstream ofs; + + ofs << round(1000000.0 / duration); + + + for (size_t index = 0; index < CONST_FACE_COUNT; index++) + { + if (localOutputStructArr[index].valid && localInputStructArr[index].valid) + { + cv::Rect oldFaceRect = localOutputStructArr[index].face; + cv::Rect newFaceRect = localInputStructArr[index].face; + cv::Point2f oldCenter(oldFaceRect.x + oldFaceRect.width*0.5f, oldFaceRect.y + oldFaceRect.height*0.5f); + cv::Point2f newCenter(newFaceRect.x + newFaceRect.width*0.5f, newFaceRect.y + newFaceRect.height*0.5f); + + localFaceShift[index] = newCenter - oldCenter; + } + else + { + localFaceShift[index] = cv::Point2f(0, 0); + } + } + + for (size_t index = 0; index < CONST_FACE_COUNT; index++) + { + if (localOutputStructArr[index].valid) + { + + + faceStruct[index].ApplyPreds(localOutputStructArr[index].preds); + + + for (size_t i = 0; i < CONST_PREDS_COUNT; i++) + { + //cv::ellipse(lastFrame, cv::Point2f(faceStruct[index].preds[i](0), 720 - faceStruct[index].preds[i](1)) + localFaceShift[index], cv::Size(2, 2), 0, 0, 360, cv::Scalar(255, 128, 128), 4, 8, 0); + } + + + Vector2f posFrom = faceStruct[index].center - faceStruct[index].size*0.5f* 1.25f; + Vector2f posTo = faceStruct[index].center + faceStruct[index].size*0.5f* 1.25f; + + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], posFrom, posTo, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + else + { + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], {0,0}, { 0,0 }, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + + } + + + + for (size_t index = 0; index < CONST_FACE_COUNT; index++) + { + if (localInputStructArr[index].valid) + { + //cv::rectangle(lastFrame, localInputStructArr[index].face, cv::Scalar(255, 0, 255), 4, 8, 0); + } + } + + */ + + + + cap >> frame; // get a new frame from camera/video or read image + + if (frame.empty()) + { + return; + } + + cv::Mat image = frame.clone(); + + frameArr.push_back(image); + + while (frameArr.size() > 40) + { + lineShift++; + frameArr.erase(frameArr.begin()); + } + + currentIndex++; + + faceLandmarkArr = faceLandmarkDetector.GetFaceLandmarks(frame, currentIndex); + + + bool newProcessedIndexFound = false; + int newProcessedIndex; + + for (size_t i = 0; i < faceLandmarkArr.size(); i++) + { + if (faceLandmarkArr[i].valid) + { + if (!newProcessedIndexFound) + { + newProcessedIndexFound = true; + newProcessedIndex = faceLandmarkArr[i].frameIndex; + } + else + { + if (newProcessedIndex < faceLandmarkArr[i].frameIndex) + { + newProcessedIndex = faceLandmarkArr[i].frameIndex; + } + } + } + } + + + if (newProcessedIndexFound && newProcessedIndex > lastProcessedIndex) + { + indexStep = 0; + + lastProcessedIndex = newProcessedIndex; + prevPassedIndex = currentIndex; + + } + else + { + if (prevPassedIndex > lastProcessedIndex + indexStep) + { + indexStep++; + } + } + + //std::cout << currentIndex << " " << lastProcessedIndex << " stepped:" << lastProcessedIndex + indexStep << " indexStep: " << indexStep << std::endl; + + + cv::Mat renderImage; + + if (lastProcessedIndex + indexStep - lineShift < 0) + { + renderImage = frameArr[0]; + } + else if (lastProcessedIndex + indexStep - lineShift >= frameArr.size()) + { + renderImage = frameArr[frameArr.size() - 1]; + } + else + { + renderImage = frameArr[lastProcessedIndex + indexStep - lineShift]; + } + + renderImage = renderImage.clone(); + + + + + + cv::Rect frameRect(cv::Point(), renderImage.size()); + + for (size_t i = 0; i < faceLandmarkArr.size(); i++) + { + if (faceLandmarkArr[i].valid) + { + cv::rectangle(renderImage, faceLandmarkArr[i].faceRect, cv::Scalar(0, 0, 255), 1, 4, 0); + + for (size_t j = 0; j < faceLandmarkArr[i].landmarkArr.size(); j++) + { + + //cv::circle(renderImage, faceLandmarkArr[i].landmarkArr[j], 0.1, cv::Scalar(0, 255, 255), 4, 8, 0); + + } + + } + } + + for (size_t index = 0; index < faceLandmarkArr.size(); index++) + { + if (faceLandmarkArr[index].valid) + { + + + faceStruct[index].ApplyPreds(faceLandmarkArr[index].landmarkArr); + + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + cv::ellipse(renderImage, cv::Point2f(faceStruct[index].preds[i](0), 720 - faceStruct[index].preds[i](1)), cv::Size(2, 2), 0, 0, 360, cv::Scalar(255, 128, 128), 4, 8, 0); + } + + + Vector2f posFrom = faceStruct[index].center - faceStruct[index].size*0.5f* 1.35f; + Vector2f posTo = faceStruct[index].center + faceStruct[index].size*0.5f* 1.35f; + + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], posFrom, posTo, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + else + { + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], { 0,0 }, { 0,0 }, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + + } + + + glBindTexture(GL_TEXTURE_2D, lastFrameTexture); + + static std::array buffer; + + int step = renderImage.step; + int height = renderImage.rows; + int width = renderImage.cols; + int channels = 3; + char * data = (char *)renderImage.data; + for (int i = 0; i < height; i++) + { + int ci = height - i - 1; + memcpy(&buffer[i*width*channels], &(data[ci*step]), width*channels); + } + + + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGB, + 1280, + 720, + 0, + GL_BGR_EXT, + GL_UNSIGNED_BYTE, + &buffer[0]); +} + + +bool TMyApplication::IsInited() +{ + return Inited; +} diff --git a/game/main_code.cpp b/game/main_code.cpp old mode 100644 new mode 100755 index 62be883..c165908 --- a/game/main_code.cpp +++ b/game/main_code.cpp @@ -1,493 +1,595 @@ -#include "main_code.h" - -#include -#include -#include -#include - -#include "include/Engine.h" - -#include "menucode.h" - -#include "main_code.h" - -boost::signals2::signal OnTapUpSignal; -boost::signals2::signal OnTapUpAfterMoveSignal; -boost::signals2::signal OnTapDownSignal; -boost::signals2::signal OnFlingSignal; -boost::signals2::signal OnScrollSignal; - -boost::signals2::signal OnDrawSignal; - - -const std::string CONST_BLOCK_TEXTURE1 = "block1"; -const std::string CONST_BLOCK_TEXTURE2 = "block2"; -const std::string CONST_BLOCK_TEXTURE3 = "block3"; - -const std::string CONST_BONUS_GOTHROUGH_TEXTURE = "bonus_gothrough"; -const std::string CONST_BONUS_MULTIPLIER_TEXTURE = "bonus_multiplier"; -const std::string CONST_BONUS_FLOOR_TEXTURE = "bonus_floor"; - -const std::string CONST_BALL_TEXTURE = "ball"; -const std::string CONST_BALLGLOW_TEXTURE = "ball_glow"; - -const std::string CONST_REFLECTOR_TEXTURE = "reflector"; - -const std::string CONST_WALL_LEFT_TEXTURE = "wall_left"; -const std::string CONST_WALL_RIGHT_TEXTURE = "wall_right"; -const std::string CONST_WALL_UP_TEXTURE = "wall_up"; -const std::string CONST_WALL_BONUS_TEXTURE = "wall_bonus"; - -const std::string CONST_BACK_BTN_TEXTURE = "back_btn"; -const std::string CONST_SLIDE_UP_BTN_TEXTURE = "slide_up_btn"; -const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE = "tap_to_continue_btn"; -const std::string CONST_LOADING_TEXTURE = "loading"; -const std::string CONST_LOGO_SMALL_TEXTURE = "logo_small"; -const std::string CONST_LOADING_BACKGROUND_BLACK = "loading_background_black"; -const std::string CONST_CREDITS_TEXTURE = "credits"; - -const float CONST_CREDITS_SHOW_TIME = 150.f; - -TMyApplication* Application; - - -void TMyApplication::InnerInit() -{ - - Application = this; - -#ifdef TARGET_WIN32 -#ifdef NDEBUG - ST::PathToResources = "resources/"; -#else - ST::PathToResources = "../../../assets/"; -#endif -#endif - -#ifdef TARGET_IOS - ST::PathToResources = "assets/"; -#endif - - if (Console != NULL) - { - *Console<<"APP INIT\n"; - } - srand (static_cast(time(NULL))); - GameState = CONST_GAMESTATE_PRELOADING; - StateTimer = 0.f; - - - ResourceManager->ShaderManager.AddShader("DefaultShader", "shader1vertex.txt", "shader1fragment.txt"); - ResourceManager->ShaderManager.AddShader("FrameShader", "frameshader_vertex.txt", "frameshader_fragment.txt"); - ResourceManager->ShaderManager.AddShader("BrickShader", "brickshader_vertex.txt", "brickshader_fragment.txt"); - Renderer->PushShader("DefaultShader"); - - ResourceManager->TexList.AddTexture(CONST_LOADING_BACKGROUND_BLACK + ".png", CONST_LOADING_BACKGROUND_BLACK); - ResourceManager->TexList.AddTexture(CONST_LOADING_TEXTURE + ".png", CONST_LOADING_TEXTURE); - ResourceManager->TexList.AddTexture(CONST_LOGO_SMALL_TEXTURE + ".png", CONST_LOGO_SMALL_TEXTURE); - - ResourceManager->TexList.AddTexture("console_bkg.bmp"); - - ResourceManager->FrameManager.AddFrameRenderBuffer("LevelBuffer", 512, 512); - - OnDrawSignal.connect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); - Inited = true; - - Renderer->SetOrthoProjection(); - - Renderer->SetFullScreenViewport(); - -} - -void TMyApplication::InnerDeinit() -{ - Inited = false; - Loaded = false; - if (Console != NULL) - { - *Console<<"APP DEINIT\n"; - } - - OnTapUpSignal.disconnect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); - OnTapUpSignal.disconnect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); - - OnTapUpAfterMoveSignal.disconnect(boost::bind(&TGameMenu::OnTapUpAfterMove, boost::ref(Menu), _1)); - - - OnFlingSignal.disconnect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); - OnFlingSignal.disconnect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); - - OnScrollSignal.disconnect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); - OnScrollSignal.disconnect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); - - OnTapDownSignal.disconnect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); - OnTapDownSignal.disconnect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); - OnTapDownSignal.disconnect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); - - - OnDrawSignal.disconnect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); - OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); - OnDrawSignal.disconnect(boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); - OnDrawSignal.disconnect(boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); - -} - -void TMyApplication::InnerOnTapDown(Vector2f p) -{ - //-OnTapDownSignal(Vector2f(p.v[0], p.v[1])); - OnTapDownSignal(Vector2f(p(0), p(1))); -} - -void TMyApplication::InnerOnTapUp(Vector2f p) -{ - OnTapUpSignal(Vector2f(p(0), p(1))); -} - -void TMyApplication::InnerOnTapUpAfterMove(Vector2f p) -{ - OnTapUpAfterMoveSignal(Vector2f(p(0), p(1))); -} - -void TMyApplication::InnerOnMove(Vector2f p, Vector2f shift) -{ - OnScrollSignal(Vector2f(shift(0), shift(1))); -} - -void TMyApplication::OnFling(Vector2f v) -{ -} - - -void TMyApplication::ApplySignalsToMenu() -{ - - OnTapUpSignal.connect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); - OnTapUpAfterMoveSignal.connect(boost::bind(&TGameMenu::OnTapUpAfterMove, boost::ref(Menu), _1)); - OnFlingSignal.connect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); - OnScrollSignal.connect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); - OnTapDownSignal.connect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); - -} - - -void TMyApplication::DisapplySignalsToMenu() -{ - OnTapUpSignal.disconnect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); - OnTapUpAfterMoveSignal.disconnect(boost::bind(&TGameMenu::OnTapUpAfterMove, boost::ref(Menu), _1)); - OnFlingSignal.disconnect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); - OnScrollSignal.disconnect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); - OnTapDownSignal.disconnect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); -} - -void TMyApplication::ApplySignalsToGame() -{ - OnTapUpSignal.connect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); - OnFlingSignal.connect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); - OnScrollSignal.connect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); - OnTapDownSignal.connect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); - -} - -void TMyApplication::DisapplySignalsToGame() -{ - OnTapUpSignal.disconnect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); - OnFlingSignal.disconnect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); - OnScrollSignal.disconnect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); - OnTapDownSignal.disconnect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); - -} - -void TMyApplication::ApplySignalsToCredits() -{ - OnTapDownSignal.connect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); -} - - -void TMyApplication::DisapplySignalsToCredits() -{ - OnTapDownSignal.disconnect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); -} - -void TMyApplication::LoadResources() -{ - - TextureNamesToLoad.clear(); - - TextureNamesToLoad.push_back(std::pair("main_menu_bkg_left.png", "main_menu_bkg_left")); - TextureNamesToLoad.push_back(std::pair("main_menu_bkg_right.png", "main_menu_bkg_right")); - TextureNamesToLoad.push_back(std::pair("select_level.png", "select_level")); - TextureNamesToLoad.push_back(std::pair("shutterstock1.png", "shutterstock1")); - TextureNamesToLoad.push_back(std::pair("shutterstock2.png", "shutterstock2")); - TextureNamesToLoad.push_back(std::pair("shutterstock3.png", "shutterstock3")); - TextureNamesToLoad.push_back(std::pair("shutterstock4.png", "shutterstock4")); - TextureNamesToLoad.push_back(std::pair("shutterstock5.png", "shutterstock5")); - TextureNamesToLoad.push_back(std::pair("shutterstock6.png", "shutterstock6")); - TextureNamesToLoad.push_back(std::pair("shutterstock7.png", "shutterstock7")); - TextureNamesToLoad.push_back(std::pair("shutterstock8.png", "shutterstock8")); - TextureNamesToLoad.push_back(std::pair("shutterstock9.png", "shutterstock9")); - - TextureNamesToLoad.push_back(std::pair("shutterstock10.png", "shutterstock10")); - TextureNamesToLoad.push_back(std::pair("shutterstock11.png", "shutterstock11")); - TextureNamesToLoad.push_back(std::pair("shutterstock12.png", "shutterstock12")); - TextureNamesToLoad.push_back(std::pair("levelshot1.png", "levelshot1")); - TextureNamesToLoad.push_back(std::pair("levelshot2.png", "levelshot2")); - TextureNamesToLoad.push_back(std::pair("levelshot3.png", "levelshot3")); - TextureNamesToLoad.push_back(std::pair("levelshot4.png", "levelshot4")); - TextureNamesToLoad.push_back(std::pair("levelshot5.png", "levelshot5")); - TextureNamesToLoad.push_back(std::pair("levelshot6.png", "levelshot6")); - TextureNamesToLoad.push_back(std::pair("levelshot7.png", "levelshot7")); - TextureNamesToLoad.push_back(std::pair("levelshot8.png", "levelshot8")); - TextureNamesToLoad.push_back(std::pair("levelshot9.png", "levelshot9")); - TextureNamesToLoad.push_back(std::pair("levelshot10.png", "levelshot10")); - TextureNamesToLoad.push_back(std::pair("levelshot11.png", "levelshot11")); - TextureNamesToLoad.push_back(std::pair("levelshot12.png", "levelshot12")); - TextureNamesToLoad.push_back(std::pair("game_end.png", "game_end")); - - TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE1 + ".png", CONST_BLOCK_TEXTURE1)); - TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE2 + ".png", CONST_BLOCK_TEXTURE2)); - TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE3 + ".png", CONST_BLOCK_TEXTURE3)); - TextureNamesToLoad.push_back(std::pair(CONST_BONUS_GOTHROUGH_TEXTURE + ".png", CONST_BONUS_GOTHROUGH_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_BONUS_MULTIPLIER_TEXTURE + ".png", CONST_BONUS_MULTIPLIER_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_BONUS_FLOOR_TEXTURE + ".png", CONST_BONUS_FLOOR_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_BALL_TEXTURE + ".png", CONST_BALL_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_BALLGLOW_TEXTURE + ".png", CONST_BALLGLOW_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_WALL_LEFT_TEXTURE + ".png", CONST_WALL_LEFT_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_WALL_RIGHT_TEXTURE + ".png", CONST_WALL_RIGHT_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_WALL_UP_TEXTURE + ".png", CONST_WALL_UP_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_WALL_BONUS_TEXTURE + ".png", CONST_WALL_BONUS_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_REFLECTOR_TEXTURE + ".png", CONST_REFLECTOR_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_BACK_BTN_TEXTURE + ".png", CONST_BACK_BTN_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_SLIDE_UP_BTN_TEXTURE + ".png", CONST_SLIDE_UP_BTN_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_TAP_TO_CONTINUE_BTN_TEXTURE + ".png", CONST_TAP_TO_CONTINUE_BTN_TEXTURE)); - TextureNamesToLoad.push_back(std::pair(CONST_CREDITS_TEXTURE + ".png", CONST_CREDITS_TEXTURE)); - -#ifdef TARGET_IOS - ResourceManager->SoundManager.LoadMusicLooped("level1ogg.ogg"); -#else - //ResourceManager->SoundManager.LoadMusic("level1ogg.ogg"); -#endif - - ResourceManager->FontManager.AddFont("droid_sans14", "droid_sans14_font_bitmap.png", "droid_sans14_font_charmap.txt"); - ResourceManager->FontManager.PushFont("droid_sans14"); - - TryLoadSavedGame(); - -} - -void TMyApplication::TryLoadSavedGame() -{ - - std::string fileName = GetFilePathUserData("progress.txt"); - - FILE* file = fopen(fileName.c_str(), "r"); - if (file != NULL) - { - char line[100]; - char* r; - r = fgets(line, 100, file); - if (r != NULL) - { - Menu.SetMenuItemCount(toint(r)); - } - fclose(file); - } -} - -void TMyApplication::TrySaveGame() -{ - - std::string fileName = GetFilePathUserData("progress.txt"); - - std::string s = tostr(Menu.GetMenuItemCount()); - FILE* file = fopen(fileName.c_str(), "w"); - if (file != NULL) - { - fputs(s.c_str(), file); - fflush(file); - fclose(file); - } - -} - - - -void TMyApplication::InnerDraw() -{ - glDisable(GL_DEPTH_TEST); - - - OnDrawSignal(); - -} - - -void TMyApplication::InnerUpdate(size_t dt) -{ - - if (GameState == CONST_GAMESTATE_PRELOADING) - { - *SE::Console << "1CONST_GAMESTATE_PRELOADING"; - StateTimer += dt/1000.f; - if (StateTimer >= 1.f) - { - LoadResources(); - GameState = CONST_GAMESTATE_LOADING; - StateTimer = 0.f; - } - } - else if (GameState == CONST_GAMESTATE_LOADING) - { - *SE::Console << "2CONST_GAMESTATE_LOADING"; - StateTimer += dt/1000.f; - if (StateTimer >= 1.f) - { - StateTimer -= 1.f; - } - - if (TextureNamesToLoad.size() != 0) - { - ResourceManager->TexList.AddTexture(TextureNamesToLoad.begin()->first, TextureNamesToLoad.begin()->second); - TextureNamesToLoad.erase(TextureNamesToLoad.begin()); - } - else - { - GameState = CONST_GAMESTATE_MENU; - ApplySignalsToMenu(); - OnDrawSignal.disconnect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); - OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); - StateTimer = 0.f; - Loaded = true; - } - } - else if (GameState == CONST_GAMESTATE_LEVEL) - { - *SE::Console << "3CONST_GAMESTATE_LEVEL"; - GameLevel.Update(dt); - } - else if (GameState == CONST_GAMESTATE_MENU) - { - //*SE::Console << "4CONST_GAMESTATE_MENU"; - Menu.Update(dt); - } - else if (GameState == CONST_GAMESTATE_FROM_MENU_TO_LEVEL) - { - *SE::Console << "5CONST_GAMESTATE_FROM_MENU_TO_LEVEL"; - GameLevel.Update(dt); - if (GameLevel.IsLoaded()) - { - //*SE::Console << "5CONST_GAMESTATE_FROM_MENU_TO_LEVEL"; - GameState = CONST_GAMESTATE_LEVEL; - OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); - //CONNECT SLOT - DisapplySignalsToMenu(); - ApplySignalsToGame(); - } - } - else if (GameState == CONST_GAMESTATE_FROM_MENU_TO_CREDITS) - { - *SE::Console << "6CONST_GAMESTATE_FROM_MENU_TO_CREDITS"; - Menu.Update(dt); - GameCredits.Update(dt); - StateTimer -= dt; - if (StateTimer <= 0.f) - { - GameState = CONST_GAMESTATE_CREDITS; - OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); - ApplySignalsToCredits(); - StateTimer = 0.f; - } - } - else if (GameState == CONST_GAMESTATE_CREDITS) - { - //*SE::Console << "7CONST_GAMESTATE_CREDITS"; - GameCredits.Update(dt); - } - else if (GameState == CONST_GAMESTATE_FROM_CREDITS_TO_MENU) - { - Menu.Update(dt); - GameCredits.Update(dt); - StateTimer -= dt; - if (StateTimer <= 0.f) - { - GameState = CONST_GAMESTATE_MENU; - StateTimer = 0.f; - ApplySignalsToMenu(); - OnDrawSignal.disconnect(boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); - } - } -} - - -void TMyApplication::GoFromMenuToGame(int level) -{ -//#ifndef TARGET_IOS -// ResourceManager->SoundManager.PlayMusicLooped("level1ogg.ogg"); -//#endif - - GameLevel.FillWithFile(ST::PathToResources + "level"+tostr(level+1)+".txt"); - GameLevel.SetLoading("shutterstock" + tostr(level+1), "levelshot"+tostr(level+1)); - GameState = CONST_GAMESTATE_FROM_MENU_TO_LEVEL; - OnDrawSignal.connect(1, boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); - - DisapplySignalsToMenu(); - -} - -void TMyApplication::GoFromGameToMenu() -{ - //#ifndef TARGET_IOS -// ResourceManager->SoundManager.StopMusic("level1ogg.ogg"); -//#endif - TrySaveGame(); - DisapplySignalsToGame(); - ApplySignalsToMenu(); - GameState = CONST_GAMESTATE_MENU; - OnDrawSignal.disconnect(boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); -} - -void TMyApplication::GoFromMenuToCredits() -{ - GameState = CONST_GAMESTATE_FROM_MENU_TO_CREDITS; - StateTimer = CONST_CREDITS_SHOW_TIME; - GameCredits.StartAppear(); - OnDrawSignal.connect(1, boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); - DisapplySignalsToMenu(); - -} - -void TMyApplication::GoFromCreditsToMenu() -{ - - GameState = CONST_GAMESTATE_FROM_CREDITS_TO_MENU; - StateTimer = CONST_CREDITS_SHOW_TIME; - GameCredits.StartDisappear(); - OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); - - DisapplySignalsToCredits(); -} - -void TMyApplication::MarkSetGameLevelPause() -{ - OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); -} - -void TMyApplication::MarkReleaseGameLevelPause() -{ - OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); -} - - -void TMyApplication::OpenNextLevel() -{ - Menu.OpenNextLevel(); -} - -bool TMyApplication::IsLoaded() -{ - return Loaded; -} - -bool TMyApplication::IsInited() -{ - return Inited; -} +#include "main_code.h" + +#include +#include +#include +#include + +#include "include/Engine.h" + +#include "main_code.h" + + + +//#define USE_PREDICTION + +cv::Point flipVertical(cv::Point point) { + return cv::Point(point.x, 720 - point.y); +} + +FaceStruct::FaceStruct() +{ + modelPoints.push_back(cv::Point3d(6.825897, 6.760612, 4.402142)); // left brow left corner + modelPoints.push_back(cv::Point3d(1.330353, 7.122144, 6.903745)); // left brow right corner + modelPoints.push_back(cv::Point3d(-1.330353, 7.122144, 6.903745)); // right brow left corner + modelPoints.push_back(cv::Point3d(-6.825897, 6.760612, 4.402142)); // right brow right corner + modelPoints.push_back(cv::Point3d(5.311432, 5.485328, 3.987654)); // left eye left corner + modelPoints.push_back(cv::Point3d(1.789930, 5.393625, 4.413414)); // left eye right corner + modelPoints.push_back(cv::Point3d(-1.789930, 5.393625, 4.413414)); // right eye left corner + modelPoints.push_back(cv::Point3d(-5.311432, 5.485328, 3.987654)); // right eye right corner + modelPoints.push_back(cv::Point3d(2.005628, 1.409845, 6.165652)); // nose left corner + modelPoints.push_back(cv::Point3d(-2.005628, 1.409845, 6.165652)); // nose right corner + modelPoints.push_back(cv::Point3d(2.774015, -2.080775, 5.048531)); // mouth left corner + modelPoints.push_back(cv::Point3d(-2.774015, -2.080775, 5.048531)); // mouth right corner + modelPoints.push_back(cv::Point3d(0.000000, -3.116408, 6.097667)); // mouth central bottom corner + modelPoints.push_back(cv::Point3d(0.000000, -7.415691, 4.070434)); // chin corner + + poseMatrix = cv::Mat(3, 4, CV_64FC1); + eulerAngles = cv::Mat(3, 1, CV_64FC1); + + boxModelSrc.push_back(cv::Point3d(10.0, 10.0, 10.0)); + boxModelSrc.push_back(cv::Point3d(10.0, 10.0, -10.0)); + boxModelSrc.push_back(cv::Point3d(10.0, -10.0, -10.0)); + boxModelSrc.push_back(cv::Point3d(10.0, -10.0, 10.0)); + boxModelSrc.push_back(cv::Point3d(-10.0, 10.0, 10.0)); + boxModelSrc.push_back(cv::Point3d(-10.0, 10.0, -10.0)); + boxModelSrc.push_back(cv::Point3d(-10.0, -10.0, -10.0)); + boxModelSrc.push_back(cv::Point3d(-10.0, -10.0, 10.0)); +} + +FaceStruct::FaceStruct(const std::array& fromPreds, cv::Mat& cameraMatrix, cv::Mat& distortionCoefficients) +{ + FaceStruct(); + ApplyPreds(fromPreds, cameraMatrix, distortionCoefficients); +} + +void FaceStruct::CalcFromPreds(cv::Mat& cameraMatrix, cv::Mat& distortionCoefficients) +{ + float minX = preds[0](0); + float maxX = preds[0](0); + float minY = preds[0](1); + float maxY = preds[0](1); + float sumX = preds[0](0); + float sumY = preds[0](1); + + for (size_t i = 1; i < LANDMARK_POINT_COUNT; i++) + { + if (minX > preds[i](0)) + { + minX = preds[i](0); + } + + if (minY > preds[i](1)) + { + minY = preds[i](1); + } + + if (maxX < preds[i](0)) + { + maxX = preds[i](0); + } + + if (maxY < preds[i](1)) + { + maxY = preds[i](1); + } + + sumX += preds[i](0); + sumY += preds[i](1); + } + + float avgX = sumX / static_cast(LANDMARK_POINT_COUNT); + float avgY = sumY / static_cast(LANDMARK_POINT_COUNT); + + std::vector imagePoints; + imagePoints.push_back(cv::Point2f(preds[17](0), preds[17](1))); // #17 left brow left corner + imagePoints.push_back(cv::Point2f(preds[21](0), preds[21](1))); // #21 left brow right corner + imagePoints.push_back(cv::Point2f(preds[22](0), preds[22](1))); // #22 right brow left corner + imagePoints.push_back(cv::Point2f(preds[26](0), preds[26](1))); // #26 right brow right corner + imagePoints.push_back(cv::Point2f(preds[36](0), preds[36](1))); // #36 left eye left corner + imagePoints.push_back(cv::Point2f(preds[39](0), preds[39](1))); // #39 left eye right corner + imagePoints.push_back(cv::Point2f(preds[42](0), preds[42](1))); // #42 right eye left corner + imagePoints.push_back(cv::Point2f(preds[45](0), preds[45](1))); // #45 right eye right corner + imagePoints.push_back(cv::Point2f(preds[31](0), preds[31](1))); // #31 nose left corner + imagePoints.push_back(cv::Point2f(preds[35](0), preds[35](1))); // #35 nose right corner + imagePoints.push_back(cv::Point2f(preds[48](0), preds[48](1))); // #48 mouth left corner + imagePoints.push_back(cv::Point2f(preds[54](0), preds[54](1))); // #54 mouth right corner + imagePoints.push_back(cv::Point2f(preds[57](0), preds[57](1))); // #57 mouth central bottom corner + imagePoints.push_back(cv::Point2f(preds[8](0), preds[8](1))); // #8 chin corner + + cv::solvePnP(modelPoints, imagePoints, cameraMatrix, distortionCoefficients, rotationVector, translationVector); + + rotationVector.at(0) = rotationVectorSmoothers[0].responsiveAnalogReadSimple(rotationVector.at(0)); + rotationVector.at(1) = rotationVectorSmoothers[1].responsiveAnalogReadSimple(rotationVector.at(1)); + rotationVector.at(2) = rotationVectorSmoothers[2].responsiveAnalogReadSimple(rotationVector.at(2)); + + translationVector.at(0) = translationVectorSmoothers[0].responsiveAnalogReadSimple(translationVector.at(0)); + translationVector.at(1) = translationVectorSmoothers[1].responsiveAnalogReadSimple(translationVector.at(1)); + translationVector.at(2) = translationVectorSmoothers[2].responsiveAnalogReadSimple(translationVector.at(2)); + + cv::projectPoints(boxModelSrc, rotationVector, translationVector, cameraMatrix, distortionCoefficients, boxModelDst); + + // calc Euler angles + cv::Rodrigues(rotationVector, rotationMatrix); + cv::hconcat(rotationMatrix, translationVector, poseMatrix); + + cv::Mat outIntrinsics = cv::Mat(3, 3, CV_64FC1); + cv::Mat outRotation = cv::Mat(3, 3, CV_64FC1); + cv::Mat outTranslation = cv::Mat(3, 1, CV_64FC1); + cv::decomposeProjectionMatrix(poseMatrix, outIntrinsics, outRotation, outTranslation, cv::noArray(), cv::noArray(), cv::noArray(), eulerAngles); + + // std::cout << "(" << std::setprecision(3) << eulerAngles.at(0) << ", " << std::setprecision(3) << eulerAngles.at(1) << std::setprecision(3) << eulerAngles.at(2) << ")" << std::endl; + + center = { avgX, avgY }; + size = { maxX- minX,maxY - minY }; + + //center = { centerXSmoother.responsiveAnalogReadSimple(avgX), centerYSmoother.responsiveAnalogReadSimple(avgY) }; + //size = { sizeWidthSmoother.responsiveAnalogReadSimple(maxX- minX), sizeHeightSmoother.responsiveAnalogReadSimple(maxY - minY) }; +} + +void FaceStruct::ApplyPreds(const std::array& fromPreds, cv::Mat& cameraMatrix, cv::Mat& distortionCoefficients) +{ + InnerApplyPreds(fromPreds); + CalcFromPreds(cameraMatrix, distortionCoefficients); + + /* + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = preds[i] - center; + + } + + + historicalPreds.push_back(preds); + if (historicalPreds.size() > 4) + { + historicalPreds.erase(historicalPreds.begin()); + } + + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = { 0.f, 0.f }; + for (size_t x = 0; x < historicalPreds.size(); x++) + { + preds[i] += historicalPreds[x][i]; + } + + preds[i] = preds[i] / static_cast(historicalPreds.size()); + } + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = preds[i] + center; + }*/ +} + +void FaceStruct::InnerApplyPreds(const std::array& fromPreds) +{ + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + preds[i] = { fromPreds[i].x, 720 - fromPreds[i].y}; + + } +} + + + + +cv::VideoCapture cap; + +FaceLandmarkDetector faceLandmarkDetector; + +GLuint lastFrameTexture; + + +std::array faceLandmarkArr; + +cv::Mat frame; + +std::vector frameArr; + +int currentIndex = -1; +int lastProcessedIndex = 0; +int lineShift = 0; + +int prevPassedIndex = 0; + +int indexStep = 0; + +std::array faceStruct; + + +const std::string CONST_LOADING_BACKGROUND_BLACK = "loading_background_black"; + + +TMyApplication* Application; + + +void TMyApplication::InnerInit() +{ + + Application = this; + +#ifdef TARGET_WIN32 +#ifdef NDEBUG + //ST::PathToResources = "resources/"; + ST::PathToResources = "../../../assets/"; +#else + ST::PathToResources = "../../../assets/"; +#endif +#endif + +#ifdef TARGET_IOS + ST::PathToResources = "assets/"; +#endif + + if (Console != NULL) + { + *Console<<"APP INIT\n"; + } + srand (static_cast(time(NULL))); + + ResourceManager->ShaderManager.AddShader("DefaultShader", "shader1vertex.txt", "shader1fragment.txt"); + ResourceManager->ShaderManager.AddShader("FrameShader", "frameshader_vertex.txt", "frameshader_fragment.txt"); + Renderer->PushShader("DefaultShader"); + + ResourceManager->TexList.AddTexture(CONST_LOADING_BACKGROUND_BLACK + ".png", CONST_LOADING_BACKGROUND_BLACK); + + + auto texid = ResourceManager->TexList.AddTexture("emoji/Asset 3@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 4@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 5@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 6@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 7@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 8@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 9@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 10@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 11@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 13@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 14@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 15@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 16@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 17@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 18@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 19@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 20@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 21@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 22@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 23@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 24@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 25@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 26@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 27@20x.png"); + ResourceManager->TexList.AddTexture("emoji/Asset 28@20x.png"); + + + ResourceManager->FontManager.AddFont("droid_sans14", "droid_sans14_font_bitmap.png", "droid_sans14_font_charmap.txt"); + ResourceManager->FontManager.PushFont("droid_sans14"); + + + lastFrameTexture = ResourceManager->TexList.AddEmptyTexture("lastFrameTexture", 1280, 720); + + Renderer->SetOrthoProjection(); + + Renderer->SetFullScreenViewport(); + + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + faceRenderPair[i].first.SamplerMap[CONST_STRING_TEXTURE_UNIFORM] = "Asset "+boost::lexical_cast(i+3)+"@20x.png"; + + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 0, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 512, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 0, 0)); + faceRenderPair[i].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 0, 0)); + + + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 0)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 1)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(1, 0)); + faceRenderPair[i].second.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(Vector2f(0, 0)); + faceRenderPair[i].second.RefreshBuffer(); + } + + + cap = cv::VideoCapture(0); + //cap = cv::VideoCapture("video.mp4"); + //cap = cv::VideoCapture("bp.mp4"); + + + // Check if camera opened successfully + if (!cap.isOpened()) { + std::cout << "Error opening video stream or file" << std::endl; + } + + cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); + cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); + + + + faceLandmarkDetector.StartTrackProcess(); + + Inited = true; + + + + +} + +void TMyApplication::InnerDeinit() +{ + + faceLandmarkDetector.StopTrackProcess(); + cap.release(); + + Inited = false; + + if (Console != NULL) + { + *Console<<"APP DEINIT\n"; + } + + +} + +void TMyApplication::InnerOnTapDown(Vector2f p) +{ + +} + +void TMyApplication::InnerOnTapUp(Vector2f p) +{ + +} + +void TMyApplication::InnerOnTapUpAfterMove(Vector2f p) +{ + +} + +void TMyApplication::InnerOnMove(Vector2f p, Vector2f shift) +{ + +} + +void TMyApplication::OnFling(Vector2f v) +{ +} + + + +void TMyApplication::InnerDraw() +{ + glDisable(GL_DEPTH_TEST); + + + + //glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList[CONST_LOADING_BACKGROUND_BLACK]); + glBindTexture(GL_TEXTURE_2D, lastFrameTexture); + Renderer->DrawRect(Vector2f(0.f, 0.f), Vector2f(Renderer->GetMatrixWidth(), Renderer->GetMatrixHeight())); + + + /* + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + TRenderParamsSetter params(faceRenderPair[i].first); + Renderer->DrawTriangleList(faceRenderPair[i].second); + }*/ + + + + +} + + +void TMyApplication::InnerUpdate(size_t dt) +{ + + + + cap >> frame; // get a new frame from camera/video or read image + + if (frame.empty()) + { + return; + } + + cv::Mat image = frame.clone(); + + currentIndex++; + + faceLandmarkArr = faceLandmarkDetector.GetFaceLandmarks(frame, currentIndex); + +#ifdef USE_PREDICTION + + frameArr.push_back(image); + + while (frameArr.size() > 40) + { + lineShift++; + frameArr.erase(frameArr.begin()); + } + + currentIndex++; + + faceLandmarkArr = faceLandmarkDetector.GetFaceLandmarks(frame, currentIndex); + + + bool newProcessedIndexFound = false; + int newProcessedIndex; + + for (size_t i = 0; i < faceLandmarkArr.size(); i++) + { + if (faceLandmarkArr[i].valid) + { + if (!newProcessedIndexFound) + { + newProcessedIndexFound = true; + newProcessedIndex = faceLandmarkArr[i].frameIndex; + } + else + { + if (newProcessedIndex < faceLandmarkArr[i].frameIndex) + { + newProcessedIndex = faceLandmarkArr[i].frameIndex; + } + } + } + } + + + if (newProcessedIndexFound && newProcessedIndex > lastProcessedIndex) + { + indexStep = 0; + + lastProcessedIndex = newProcessedIndex; + prevPassedIndex = currentIndex; + + } + else + { + if (prevPassedIndex > lastProcessedIndex + indexStep) + { + indexStep++; + } + } + + //std::cout << currentIndex << " " << lastProcessedIndex << " stepped:" << lastProcessedIndex + indexStep << " indexStep: " << indexStep << std::endl; + + + cv::Mat renderImage; + + if (lastProcessedIndex + indexStep - lineShift < 0) + { + renderImage = frameArr[0]; + } + else if (lastProcessedIndex + indexStep - lineShift >= frameArr.size()) + { + renderImage = frameArr[frameArr.size() - 1]; + } + else + { + renderImage = frameArr[lastProcessedIndex + indexStep - lineShift]; + } + + renderImage = renderImage.clone(); + +#else + + cv::Mat renderImage = image; +#endif + //cv::Rect frameRect(cv::Point(), renderImage.size()); + + float focalLength = renderImage.cols; + cv::Point2f center = cv::Point2f(renderImage.cols / 2, renderImage.rows / 2); + cv::Mat cameraMatrix = (cv::Mat_(3, 3) << focalLength, 0, center.x, 0, focalLength, center.y, 0, 0, 1); + cv::Mat distortionCoefficients = cv::Mat::zeros(4, 1, cv::DataType::type); + + for (size_t i = 0; i < faceLandmarkArr.size(); i++) + { + if (faceLandmarkArr[i].valid) + { + cv::rectangle(renderImage, faceLandmarkArr[i].faceRect, cv::Scalar(0, 0, 255), 1, 4, 0); + + for (size_t j = 0; j < faceLandmarkArr[i].landmarkArr.size(); j++) + { + + //cv::circle(renderImage, faceLandmarkArr[i].landmarkArr[j], 0.1, cv::Scalar(0, 255, 255), 4, 8, 0); + + } + + } + } + + for (size_t index = 0; index < faceLandmarkArr.size(); index++) + { + if (faceLandmarkArr[index].valid) + { + faceStruct[index].ApplyPreds(faceLandmarkArr[index].landmarkArr, cameraMatrix, distortionCoefficients); + + + for (size_t i = 0; i < LANDMARK_POINT_COUNT; i++) + { + cv::ellipse(renderImage, cv::Point2f(faceStruct[index].preds[i](0), 720 - faceStruct[index].preds[i](1)), cv::Size(2, 2), 0, 0, 360, cv::Scalar(255, 128, 128), 4, 8, 0); + } + + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[0]), flipVertical(faceStruct[index].boxModelDst[1]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[1]), flipVertical(faceStruct[index].boxModelDst[2]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[2]), flipVertical(faceStruct[index].boxModelDst[3]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[3]), flipVertical(faceStruct[index].boxModelDst[0]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[4]), flipVertical(faceStruct[index].boxModelDst[5]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[5]), flipVertical(faceStruct[index].boxModelDst[6]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[6]), flipVertical(faceStruct[index].boxModelDst[7]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[7]), flipVertical(faceStruct[index].boxModelDst[4]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[0]), flipVertical(faceStruct[index].boxModelDst[4]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[1]), flipVertical(faceStruct[index].boxModelDst[5]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[2]), flipVertical(faceStruct[index].boxModelDst[6]), cv::Scalar(0, 0, 255)); + cv::line(renderImage, flipVertical(faceStruct[index].boxModelDst[3]), flipVertical(faceStruct[index].boxModelDst[7]), cv::Scalar(0, 0, 255)); + + Vector2f posFrom = faceStruct[index].center - faceStruct[index].size*0.5f* 1.35f; + Vector2f posTo = faceStruct[index].center + faceStruct[index].size*0.5f* 1.35f; + + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], posFrom, posTo, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + else + { + ApplyVertexCoordVec(faceRenderPair[index].second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB], { 0,0 }, { 0,0 }, 0); + + faceRenderPair[index].second.RefreshBuffer(); + + } + + } + + + glBindTexture(GL_TEXTURE_2D, lastFrameTexture); + + static std::array buffer; + + int step = renderImage.step; + int height = renderImage.rows; + int width = renderImage.cols; + int channels = 3; + char * data = (char *)renderImage.data; + for (int i = 0; i < height; i++) + { + int ci = height - i - 1; + memcpy(&buffer[i*width*channels], &(data[ci*step]), width*channels); + } + + + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGB, + 1280, + 720, + 0, + GL_BGR_EXT, + GL_UNSIGNED_BYTE, + &buffer[0]); +} + + +bool TMyApplication::IsInited() +{ + return Inited; +} diff --git a/game/main_code.h b/game/main_code.h old mode 100644 new mode 100755 index 6efa645..76c1961 --- a/game/main_code.h +++ b/game/main_code.h @@ -1,158 +1,119 @@ -#ifndef MAIN_CODE_H_INCLUDED -#define MAIN_CODE_H_INCLUDED - -#ifdef TARGET_ANDROID -#include "android_api.h" -#endif - -#ifdef TARGET_WIN32 -#define NOMINMAX 1 -#include -#undef NOMINMAX -#endif - -#include -#include -#include - -#include "boost/shared_ptr.hpp" -#include "boost/thread/thread.hpp" -#include "boost/assign.hpp" -#include "boost/bind.hpp" - -#include "include/Engine.h" - -#include "boost/signals2.hpp"//Signal must be included after asio - -#include "gamecode.h" -#include "menucode.h" -#include "creditscode.h" -#include "loadingcode.h" - -using namespace SE; - - -extern boost::signals2::signal OnTapUpSignal; -extern boost::signals2::signal OnTapUpAfterMoveSignal; - -extern boost::signals2::signal OnTapDownSignal; -extern boost::signals2::signal OnFlingSignal; -extern boost::signals2::signal OnScrollSignal; - -extern boost::signals2::signal OnDrawSignal; - -extern const std::string CONST_BLOCK_TEXTURE1; -extern const std::string CONST_BLOCK_TEXTURE2; -extern const std::string CONST_BLOCK_TEXTURE3; - -extern const std::string CONST_BONUS_GOTHROUGH_TEXTURE; -extern const std::string CONST_BONUS_MULTIPLIER_TEXTURE; -extern const std::string CONST_BONUS_FLOOR_TEXTURE; - -extern const std::string CONST_BALL_TEXTURE; -extern const std::string CONST_BALLGLOW_TEXTURE; - -extern const std::string CONST_WALL_LEFT_TEXTURE; -extern const std::string CONST_WALL_RIGHT_TEXTURE; -extern const std::string CONST_WALL_UP_TEXTURE; -extern const std::string CONST_WALL_BONUS_TEXTURE; - - -extern const std::string CONST_REFLECTOR_TEXTURE; - -extern const std::string CONST_BACK_BTN_TEXTURE; - -extern const std::string CONST_SLIDE_UP_BTN_TEXTURE; -extern const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE; - -extern const std::string CONST_BACK_BTN_TEXTURE; -extern const std::string CONST_SLIDE_UP_BTN_TEXTURE; -extern const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE; -extern const std::string CONST_LOADING_TEXTURE; -extern const std::string CONST_LOGO_SMALL_TEXTURE; -extern const std::string CONST_LOADING_BACKGROUND_BLACK; -extern const std::string CONST_CREDITS_TEXTURE; - - - -const int CONST_GAMESTATE_LEVEL = 1; -const int CONST_GAMESTATE_MENU = 0; -const int CONST_GAMESTATE_FROM_MENU_TO_LEVEL = 2; -const int CONST_GAMESTATE_FROM_MENU_TO_CREDITS = 3; -const int CONST_GAMESTATE_CREDITS = 4; -const int CONST_GAMESTATE_FROM_CREDITS_TO_MENU = 5; -const int CONST_GAMESTATE_LOADING = 6; -const int CONST_GAMESTATE_PRELOADING = 7; - - -class TMyApplication : public TApplication -{ -protected: - TGameMenu Menu; - TGameLevel GameLevel; - TGameCredits GameCredits; - TGameLoading GameLoading; - - int GameState; - float StateTimer; - - void TryLoadSavedGame(); - void TrySaveGame(); - - bool Inited; - - std::vector > TextureNamesToLoad; - - void ApplySignalsToMenu(); - void DisapplySignalsToMenu(); - void ApplySignalsToGame(); - void DisapplySignalsToGame(); - void ApplySignalsToCredits(); - void DisapplySignalsToCredits(); - -public: - bool Loaded; - - TMyApplication() : TApplication(), Loaded(false), Inited(false) { } - - virtual void InnerInit(); - - virtual void InnerDeinit(); - - virtual void InnerDraw(); - - virtual void InnerUpdate(size_t dt); - - void GoFromMenuToGame(int level); - void GoFromGameToMenu(); - void GoFromMenuToCredits(); - void GoFromCreditsToMenu(); - void MarkSetGameLevelPause(); - void MarkReleaseGameLevelPause(); - - void OpenNextLevel(); - - bool IsLoaded(); - - bool IsInited(); - - void LoadResources(); - - virtual void InnerOnTapDown(Vector2f p); - - virtual void InnerOnTapUp(Vector2f p); - - virtual void InnerOnTapUpAfterMove(Vector2f p); - - virtual void InnerOnMove(Vector2f p, Vector2f shift); - - virtual void OnFling(Vector2f v); - -}; - - -extern TMyApplication* Application; - - - -#endif +#ifndef MAIN_CODE_H_INCLUDED +#define MAIN_CODE_H_INCLUDED + +#ifdef TARGET_ANDROID +#include "android_api.h" +#endif + +#ifdef TARGET_WIN32 +#define NOMINMAX 1 +#include +#undef NOMINMAX +#endif + +#include +#include +#include + +#include "boost/shared_ptr.hpp" +#include "boost/thread/thread.hpp" +#include "boost/assign.hpp" +#include "boost/bind.hpp" + +#include "include/Engine.h" + +#include "boost/signals2.hpp"//Signal must be included after asio + +#include "../windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.h" +#include "../windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.h" + + +struct FaceStruct +{ + SE::Vector2f center; + SE::Vector2f size; + + ValueSmoother centerXSmoother; + ValueSmoother centerYSmoother; + ValueSmoother sizeWidthSmoother; + ValueSmoother sizeHeightSmoother; + + std::array preds; + + //std::vector> historicalPreds; + + std::vector modelPoints; + cv::Mat rotationVector; + cv::Mat translationVector; + cv::Mat rotationMatrix; + cv::Mat poseMatrix; + cv::Mat eulerAngles; + + std::vector boxModelSrc; + std::vector boxModelDst; + + ValueSmoother rotationVectorSmoothers[3]; + ValueSmoother translationVectorSmoothers[3]; + + std::vector noseEndPoint3d; + std::vector noseEndPoint2d; + + FaceStruct(); + + FaceStruct(const std::array& fromPreds, cv::Mat& cameraMatrix, cv::Mat& distortionCoefficients); + + void CalcFromPreds(cv::Mat& cameraMatrix, cv::Mat& distortionCoefficients); + + void ApplyPreds(const std::array& fromPred, cv::Mat& cameraMatrix, cv::Mat& distortionCoefficientss); + + void InnerApplyPreds(const std::array& fromPreds); +}; + + + +using namespace SE; + +extern const std::string CONST_LOADING_BACKGROUND_BLACK; + +class TMyApplication : public TApplication +{ +protected: + + bool Inited; + + std::array faceRenderPair; + +public: + + TMyApplication() : TApplication(), Inited(false) { } + + virtual void InnerInit(); + + virtual void InnerDeinit(); + + virtual void InnerDraw(); + + virtual void InnerUpdate(size_t dt); + + bool IsInited(); + + virtual void InnerOnTapDown(Vector2f p); + + virtual void InnerOnTapUp(Vector2f p); + + virtual void InnerOnTapUpAfterMove(Vector2f p); + + virtual void InnerOnMove(Vector2f p, Vector2f shift); + + virtual void OnFling(Vector2f v); + +}; + + +extern TMyApplication* Application; + + + +#endif + + diff --git a/game/menucode.cpp b/game/menucode.cpp deleted file mode 100644 index 55baa38..0000000 --- a/game/menucode.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include "menucode.h" -#include "main_code.h" - -const float CONST_SPEED_NEG_ACCELERATION_K = 0.03f; - -const float CONST_MENU_POS_K = 0.25f; - -const float CONST_MENU_WINDOW_DISTANCE = 240.f + 40.f; - -const float CONST_SHIFT_ON_SIDE = 0.f; - -TGameMenu::TGameMenu() - : MenuSpeed(0) - , MenuPos(0) - , HoldToTap(false) - , MenuItemCount(1) - , SelectedGame(-1) -{ -} - - -void TGameMenu::Draw() -{ -// *SE::Console << "TGameMenu::Draw"; - CheckGlError("Draw TGameMenu"); - RenderUniform1i("sel", 0); - RenderUniform1f("Transparency", 1.f); - float bkgShift = MenuPos*0.1f - 100.f; - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["main_menu_bkg_left"]); - Renderer->DrawRect(Vector2f(bkgShift,0.f), Vector2f(480.f+bkgShift,320.f)); - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["main_menu_bkg_right"]); - Renderer->DrawRect(Vector2f(480.f+bkgShift,0.f), Vector2f(960.f+bkgShift,320.f)); - - - if (SelectedGame == 0) - { - RenderUniform1i("sel", 1); - } - else - { - RenderUniform1i("sel", 0); - } - - for (int i=0; iTexList["levelshot"+tostr(i+1)]); - Renderer->DrawRect(Vector2f(160.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*i,80.f), Vector2f(160.f+240.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*i, 240.f)); - } - - if (MenuItemCount == 12) - { - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["game_end"]); - Renderer->DrawRect(Vector2f(160.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*12,160.f - 64.f), Vector2f(160.f+256.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*12, 160.f + 64.f)); - - } - - - - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["select_level"]); - Renderer->DrawRect(Vector2f(240.f-128.f, 241.f), Vector2f(240.f+128.f, 305.f)); - - glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["logo_small"]); - Renderer->DrawRect(Vector2f(240.f-128.f+15.f, 0.f), Vector2f(240.f+128.f+15.f, 64.f)); - - CheckGlError("Draw TGameMenu 2"); - - -} - -void TGameMenu::Update(size_t dt) -{ - if (HoldToTap) - return; - // åñëè êíîïêà íå íàæàòà - float k; - - MenuPos = MenuPos + MenuSpeed*dt/1000.f; - - int menuItemToShowCount; - - if (MenuItemCount == 12) - { - menuItemToShowCount = 13; - } - else - { - menuItemToShowCount = MenuItemCount; - } - - float acc; - - if (MenuItemCount == 1) - { - k = 3; - } - else - { - k = fabs( - MenuPos - ((menuItemToShowCount-1)*CONST_MENU_WINDOW_DISTANCE*0.5f)) / ((MenuItemCount-1)*CONST_MENU_WINDOW_DISTANCE*0.5f); - } - - acc = -MenuSpeed * CONST_SPEED_NEG_ACCELERATION_K * k; - - - float xleft = (- MenuPos + CONST_SHIFT_ON_SIDE - (menuItemToShowCount-1)*CONST_MENU_WINDOW_DISTANCE); - - if (xleft < 0) - { - xleft = 0; - } - - acc += xleft*CONST_MENU_POS_K; - - float xright = (MenuPos - CONST_SHIFT_ON_SIDE); - - if (xright < 0) - { - xright = 0; - } - - acc -= xright*CONST_MENU_POS_K; - - if ((MenuSpeed + acc*dt) * MenuSpeed < 0) //Check if MenuSpeed changes direction - { - MenuSpeed = 0; - } - else - { - MenuSpeed += acc*dt; - } - - -} - -void TGameMenu::OnTapDown(Vector2f pos) -{ - *SE::Console << "TGameMenu::OnTapDown"; - HoldToTap = true; - - if (pos(1)<64.f && pos(0)>=265.f-128.f && pos(0)<=265.f+128.f) - { - Application->GoFromMenuToCredits(); - return; - } - - Vector2f realPos = pos - Vector2f(MenuPos, 0); - - if (realPos(1) >= 80.f && realPos(1) <= 240.f) - { - float x = realPos(0) - 160.f; - - int p = 0; - while (x >280.f) - { - x -= 280.f; - p++; - } - - if (x <= 240.f && x >= 0.f && (pGoFromMenuToGame(SelectedGame); - SelectedGame = -1; - } -} - -void TGameMenu::OnTapUpAfterMove(Vector2f pos) -{ - HoldToTap = false; -} - - -void TGameMenu::OnFling(Vector2f slideSpeed) -{ - *SE::Console << "TGameMenu::OnFling"; - HoldToTap = false; - MenuSpeed = slideSpeed(0); -} - -void TGameMenu::OnScroll(Vector2f shift) -{ - MenuPos = MenuPos - shift(0); -} - -void TGameMenu::OpenNextLevel() -{ - *SE::Console << "TGameMenu::OpenNextLevel"; - if (MenuItemCount < 12) - { - MenuItemCount++; - } -} - -int TGameMenu::GetMenuItemCount() -{ - *SE::Console << "TGameMenu::GetMenuItemCount"; - return MenuItemCount; -} - -void TGameMenu::SetMenuItemCount(int menuItemCount) -{ - *SE::Console << "TGameMenu::SetMenuItemCount"; - MenuItemCount = menuItemCount; -} diff --git a/game/menucode.h b/game/menucode.h deleted file mode 100644 index 9cf998f..0000000 --- a/game/menucode.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef MENUCODE_H_INCLUDED -#define MENUCODE_H_INCLUDED - -#include "include/Engine.h" -#include "game_area_interface.h" - -using namespace SE; - - -class TGameMenu : public TGameAreaAncestor -{ -protected: - float MenuSpeed; - float MenuPos; - - bool HoldToTap; - - int MenuItemCount; - - int SelectedGame; - - -public: - TGameMenu(); - virtual void Draw(); - virtual void Update(size_t dt); - virtual void OnTapDown(Vector2f pos); - virtual void OnTapUp(Vector2f pos); - virtual void OnTapUpAfterMove(Vector2f pos); - virtual void OnFling(Vector2f slideSpeed); - virtual void OnScroll(Vector2f shift); - - void OpenNextLevel(); - int GetMenuItemCount(); - void SetMenuItemCount(int menuItemCount); - -}; - - - -#endif diff --git a/proj.android-studio/app/src/main/AndroidManifest.xml b/proj.android-studio/app/src/main/AndroidManifest.xml old mode 100644 new mode 100755 diff --git a/proj.android-studio/app/src/main/res/drawable-hdpi/ic_menu_template.png b/proj.android-studio/app/src/main/res/drawable-hdpi/ic_menu_template.png old mode 100644 new mode 100755 diff --git a/proj.android-studio/app/src/main/res/drawable-ldpi/ic_menu_template.png b/proj.android-studio/app/src/main/res/drawable-ldpi/ic_menu_template.png old mode 100644 new mode 100755 diff --git a/proj.android-studio/app/src/main/res/drawable-mdpi/ic_menu_template.png b/proj.android-studio/app/src/main/res/drawable-mdpi/ic_menu_template.png old mode 100644 new mode 100755 diff --git a/proj.android-studio/app/src/main/res/values/strings.xml b/proj.android-studio/app/src/main/res/values/strings.xml old mode 100644 new mode 100755 diff --git a/proj.ios/AppDelegate.swift b/proj.ios/AppDelegate.swift old mode 100644 new mode 100755 diff --git a/proj.ios/CustomGLKView.swift b/proj.ios/CustomGLKView.swift old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Contents.json b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Contents.json old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-120.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-120.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-121.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-121.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-152.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-152.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-167.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-167.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-180.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-180.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-40.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-40.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-58.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-58.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-76.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-76.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-80.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-80.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-81.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-81.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-87.png b/proj.ios/Double Hit Balls/Images.xcassets/AppIcon.appiconset/Icon-87.png old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/Contents.json b/proj.ios/Double Hit Balls/Images.xcassets/Contents.json old mode 100644 new mode 100755 diff --git a/proj.ios/Double Hit Balls/Images.xcassets/splash.imageset/Contents.json b/proj.ios/Double Hit Balls/Images.xcassets/splash.imageset/Contents.json old mode 100644 new mode 100755 diff --git a/proj.ios/LaunchScreen.storyboard b/proj.ios/LaunchScreen.storyboard old mode 100644 new mode 100755 diff --git a/proj.ios/SENamespaceWrapper.cpp b/proj.ios/SENamespaceWrapper.cpp old mode 100644 new mode 100755 diff --git a/proj.ios/SENamespaceWrapper.h b/proj.ios/SENamespaceWrapper.h old mode 100644 new mode 100755 diff --git a/proj.ios/ViewController.swift b/proj.ios/ViewController.swift old mode 100644 new mode 100755 diff --git a/proj.ios/salmontemplate-Bridging-Header.h b/proj.ios/salmontemplate-Bridging-Header.h old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj index a6ed2c0..482c70d 100755 --- a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -22,33 +22,35 @@ {1CC98EEE-BBCB-4D79-B6D7-8511789172C5} Win32Proj DoubleHitBallswin + 10.0.16299.0 + TorchFaceTracker Application true NotSet - v140 + v141 Application true NotSet - v140 + v141 Application false true NotSet - v140 + v141 Application false true NotSet - v140 + v141 @@ -110,13 +112,13 @@ Level3 Disabled TARGET_WIN32;DEBUG;_WIN32_WINNT=0x0501;EIGEN_DONT_ALIGN_STATICALLY;_WINDOWS;WIN32;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions) - ../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_63_0/;../../../../boost_1_63_0/bin.v2/libs/system/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/date_time/build/msvc-14.0/debug/address-model-64/link-static/threading-multi/;../../../../boost_1_63_0/bin.v2/libs/regex/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/thread/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/chrono/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/signals/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510 + ../../../../luajit-vlad/luajit-vlad;..\..\..\..\..\Torch7\distro\install\include;C:\Work\TorchProjects\dlib;D:\Work\TorchProjects\dlib\dlib\..;..\..\..\..\..\Torch7\distro\exe\luajit-2.1\src;..\..\..\..\..\opencv3.4\build\include;D:\Work\Torch7\distro\install\include;../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_67_0/;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510 4503 Windows true - ../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_63_0/;../../../../boost_1_63_0/bin.v2/libs/system/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/date_time/build/msvc-14.0/debug/address-model-64/link-static/threading-multi/;../../../../boost_1_63_0/bin.v2/libs/regex/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/thread/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/chrono/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/filesystem/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/signals/build/msvc-14.0/debug/address-model-64/link-static/threading-multi;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510;../x64/Debug + ../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_67_0/stage/lib;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510;../x64/Debug libjpeg.lib;libpng.lib;Engine.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -150,7 +152,7 @@ true true WIN32;NDEBUG;_WINDOWS;TARGET_WIN32;_WIN32_WINNT=0x0501;WIN32_LEAN_AND_MEAN;EIGEN_DONT_ALIGN_STATICALLY;%(PreprocessorDefinitions) - ../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_63_0/;../../../../boost_1_63_0/bin.v2/libs/system/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/date_time/build/msvc-14.0/release/address-model-64/link-static/threading-multi/;../../../../boost_1_63_0/bin.v2/libs/regex/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/thread/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/chrono/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/signals/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510 + ../../../../luajit-vlad/luajit-vlad;..\..\..\..\..\Torch7\distro\install\include;C:\Work\TorchProjects\dlib;D:\Work\TorchProjects\dlib\dlib\..;..\..\..\..\..\Torch7\distro\exe\luajit-2.1\src;..\..\..\..\..\opencv3.4\build\include;D:\Work\Torch7\distro\install\include;../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_67_0/;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510 4503 @@ -158,26 +160,21 @@ true true true - ../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_63_0/;../../../../boost_1_63_0/bin.v2/libs/system/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/date_time/build/msvc-14.0/release/address-model-64/link-static/threading-multi/;../../../../boost_1_63_0/bin.v2/libs/regex/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/thread/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/chrono/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../boost_1_63_0/bin.v2/libs/signals/build/msvc-14.0/release/address-model-64/link-static/threading-multi;../../../../libs/boost-gil-extension;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../../../../libs/lpng1510;../x64/Release - libjpeg.lib;libpng.lib;Engine.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ..\..\..\..\..\opencv3.4-build\lib\$(Configuration);..\..\..\..\..\opencv3.4-build\3rdparty\lib\$(Configuration);..\..\..\..\..\opencv3.4-build\3rdparty\ippicv\ippicv_win\lib\intel64;../../../game;../../../../tes-engine;../../../../eigen;../../../../boost_1_67_0/stage/lib;../../../../libs/jpeg-9;../../../../libs/jpeg-9/vc10;../x64/Release;C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.1/lib/x64;C:/Program Files/NVIDIA GPU Computing + ippiw.lib;ippicvmt.lib;cudart.lib;nppc.lib;nppial.lib;nppicc.lib;nppicom.lib;nppidei.lib;nppif.lib;nppig.lib;nppim.lib;nppist.lib;nppisu.lib;nppitc.lib;npps.lib;cufft.lib;opencv_dnn341.lib;opencv_highgui341.lib;opencv_videoio341.lib;opencv_imgcodecs341.lib;opencv_imgproc341.lib;opencv_core341.lib;opencv_calib3d341.lib;opencv_cudev341.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;Engine.lib;opengl32.lib;glu32.lib;libjpeg-static.lib;libpng-static.lib;%(AdditionalDependencies) - - - - + + - - - - - + + diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters index b4ac7b9..38a700b 100755 --- a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters @@ -21,16 +21,10 @@ Файлы иÑходного кода - + Файлы иÑходного кода - - Файлы иÑходного кода - - - Файлы иÑходного кода - - + Файлы иÑходного кода @@ -41,19 +35,10 @@ Заголовочные файлы - + Заголовочные файлы - - Заголовочные файлы - - - Заголовочные файлы - - - Заголовочные файлы - - + Заголовочные файлы diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.user b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.user new file mode 100755 index 0000000..6e2aec7 --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.cpp b/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.cpp new file mode 100755 index 0000000..e4d6d46 --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.cpp @@ -0,0 +1,506 @@ +#include "FaceLandmarkDetector.h" + + + +static const size_t faceTrackerWidth = 300; +static const size_t faceTrackerHeight = 300; + +static const double faceTrackerScaleFactor = 1.0; +static const cv::Scalar faceTrackerMeanVal(104.0, 177.0, 123.0); + + +float calcSquaredDistanceBetweenFaces(const cv::Rect& face1, const cv::Rect& face2) +{ + + + cv::Point2f oldCenter(face1.x + face1.width*0.5f, face1.y + face1.height*0.5f); + cv::Point2f newCenter(face2.x + face2.width*0.5f, face2.y + face2.height*0.5f); + + float distanceX = newCenter.x - oldCenter.x; + float distanceY = newCenter.y - oldCenter.y; + + float squareDistance = distanceX * distanceX + distanceY * distanceY; + + return squareDistance; +} + + + + +FaceLandmarkDetector::FaceLandmarkDetector() +{ + + + static const cv::String faceTrackerConfiguration = "deploy.prototxt"; + static const cv::String faceTrackerBinary = "res10_300x300_ssd_iter_140000.caffemodel"; + + +#ifdef USE_3D_LANDMARKS + static const cv::String landmarkTrackerConfiguration = "fa_deploy.prototxt"; + static const cv::String landmarkTrackerBinary = "fa__iter_1400000.caffemodel"; + +#else + static const cv::String landmarkTrackerConfiguration = "landmark_deploy.prototxt"; + static const cv::String landmarkTrackerBinary = "VanFace.caffemodel"; + +#endif + + + + faceNet = cv::dnn::readNetFromCaffe(faceTrackerConfiguration, faceTrackerBinary); + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + landmarkNetArr[i] = cv::dnn::readNetFromCaffe(landmarkTrackerConfiguration, landmarkTrackerBinary); + } + +} + + +FaceLandmarkDetector::~FaceLandmarkDetector() +{ + StopTrackProcess(); +} + + +void FaceLandmarkDetector::StartTrackProcess() +{ + if (started) + { + return; + } + + + //Some init setup + + syncStop = false; + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + syncFaceRectArr[i].valid = false; + syncFaceLandmarkArr[i].valid = false; + } + + syncLastFrame = cv::Mat(); + + + //Start threads + + findFaceThread = std::thread([this]() { this->FindFaceThreadProc(); }); + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + landmarkThreadArr[i] = std::thread([this, i]() { this->FindLandmarkThreadProc(i); }); + } + + started = true; + +} + +void FaceLandmarkDetector::StopTrackProcess() +{ + if (!started) + { + return; + } + + //Do not remove braces + { + std::unique_lock lock(syncMutex); + + syncStop = true; + + syncFaceRectCond.notify_all(); + } + + + findFaceThread.join(); + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + landmarkThreadArr[i].join(); + } + + started = false; + +} + +std::array FaceLandmarkDetector::GetFaceLandmarks(cv::Mat frame, int frameIndex) +{ + + std::array result; + //Sync area + + std::unique_lock lock(syncMutex); + + // OUT to face rect thread >>>> + syncLastFrame = frame; + + syncLastFrameIndex = frameIndex; + + // IN from landmark threads <<<< + result = syncFaceLandmarkArr; + + return result; +} + + +void FaceLandmarkDetector::FindFaceThreadProc() +{ + cv::Mat localFrame; + std::array localFaceRectArr; + + bool localStop = false; + + int localFrameIndex = 0; + + + while (!syncStop) + { + + if (!localFrame.empty()) + { + std::vector faces = InnerFindFaces(localFrame); + + std::vector faceFrames; + + //Get rid of faces that are too big + for (size_t i = 0; i < faces.size(); ) + { + if (faces[i].x < 0 || faces[i].y < 0 || (faces[i].x + faces[i].width >= localFrame.cols) || (faces[i].y + faces[i].height >= localFrame.rows)) + { + faces.erase(faces.begin() + i); + } + else + { + i++; + } + } + + //Cut faces from frame + for (size_t i = 0; i lock(syncMutex); + + // OUT to landmark Threads >>>> + syncFaceRectArr = localFaceRectArr; + + syncFaceRectCond.notify_all(); + + + // IN from main thread <<<< + localFrame = syncLastFrame; + + localFrameIndex = syncLastFrameIndex; + + localStop = syncStop; + + } +} + +void FaceLandmarkDetector::FindLandmarkThreadProc(size_t threadIndex) +{ + + FaceIntermediateStruct localInputFace; + + FaceLandmarkStruct localOutputLandmarks; + + bool localStop = false; + + while (!localStop) + { + if (localInputFace.valid) + { +#ifdef USE_3D_LANDMARKS + cv::Mat landmarkInputBlob = cv::dnn::blobFromImage(localInputFace.faceFrame, 1.0, cv::Size(40, 40), cv::Scalar(), false, false); +#else + cv::Mat landmarkInputBlob = cv::dnn::blobFromImage(localInputFace.faceFrame, 1.0, cv::Size(60, 60), cv::Scalar(), false, false); +#endif + + landmarkInputBlob.reshape(0, std::vector{ 1, 1, localInputFace.faceFrame.rows, localInputFace.faceFrame.cols }); + + landmarkNetArr[threadIndex].setInput(landmarkInputBlob); +#ifdef USE_3D_LANDMARKS + cv::Mat featureBlob = landmarkNetArr[threadIndex].forward("Dense2"); +#else + cv::Mat featureBlob = landmarkNetArr[threadIndex].forward("Dense3"); +#endif + + for (int i = 0; i < featureBlob.cols / 2; i++) + { + cv::Point landmarkPoint; + + landmarkPoint.x = int(featureBlob.at(0, 2 * i) * (localInputFace.faceRect.width) + localInputFace.faceRect.x); + landmarkPoint.y = int(featureBlob.at(0, 2 * i + 1) * (localInputFace.faceRect.height) + localInputFace.faceRect.y); + localOutputLandmarks.landmarkArr[i] = landmarkPoint; + + } + + localOutputLandmarks.faceRect = localInputFace.faceRect; + localOutputLandmarks.frameIndex = localInputFace.frameIndex; + localOutputLandmarks.valid = true; + } + else + { + localOutputLandmarks.valid = false; + } + + + + //Sync area + + std::unique_lock lock(syncMutex); + + // OUT to main thread >>>> + syncFaceLandmarkArr[threadIndex] = localOutputLandmarks; + + + + + + + bool doLoop = true; + + while (doLoop) + { + + //IN from face rect thread <<<< + + localInputFace = syncFaceRectArr[threadIndex]; + + + localStop = syncStop; + + //Time to quit + if (localStop) + { + doLoop = false; + } + + if (!localInputFace.valid) + { + + syncFaceLandmarkArr[threadIndex].valid = false; + + syncFaceRectCond.wait(lock); + + } + else + { + doLoop = false; + } + } + + } +} + + + +std::vector FaceLandmarkDetector::InnerFindFaces(cv::Mat frame) +{ + if (frame.channels() == 4) + { + cvtColor(frame, frame, cv::COLOR_BGRA2BGR); + } + + cv::Mat inputBlob = cv::dnn::blobFromImage(frame, faceTrackerScaleFactor, cv::Size(faceTrackerWidth, faceTrackerHeight), faceTrackerMeanVal, false, false); + + faceNet.setInput(inputBlob, "data"); + + cv::Mat detection = faceNet.forward("detection_out"); + + cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr()); + + float confidenceThreshold = 0.5f; + + std::vector faces; + + for (int i = 0; i < detectionMat.rows; i++) + { + float confidence = detectionMat.at(i, 2); + + if (confidence > confidenceThreshold) + { + int xLeftBottom = static_cast(detectionMat.at(i, 3) * frame.cols); + int yLeftBottom = static_cast(detectionMat.at(i, 4) * frame.rows); + int xRightTop = static_cast(detectionMat.at(i, 5) * frame.cols); + int yRightTop = static_cast(detectionMat.at(i, 6) * frame.rows); + + cv::Rect object((int)xLeftBottom, (int)yLeftBottom, + (int)(xRightTop - xLeftBottom), + (int)(yRightTop - yLeftBottom)); + + + object.x = object.x - object.width*0.1f; + object.y = object.y - object.height*0.1f; + object.width = object.width*1.2f; + object.height = object.height*1.2f; + + + + faces.push_back(object); + } + } + + return faces; + +} + +cv::Mat FaceLandmarkDetector::InnerCutFaceFrame(cv::Mat frame, cv::Rect faceRect) +{ + + + cv::Mat srcROI(frame, faceRect); + + cv::Mat img2; + cvtColor(srcROI, img2, CV_RGB2GRAY); + + img2.convertTo(img2, CV_32FC1); +#ifdef USE_3D_LANDMARKS + cv::Size dsize = cv::Size(40, 40); +#else + cv::Size dsize = cv::Size(60, 60); +#endif + + cv::Mat img3 = cv::Mat(dsize, CV_32FC1); + cv::resize(img2, img3, dsize, 0, 0, cv::INTER_CUBIC); + + cv::Mat tmp_m, tmp_sd; + double m = 0, sd = 0; + meanStdDev(img3, tmp_m, tmp_sd); + m = tmp_m.at(0, 0); + sd = tmp_sd.at(0, 0); + + img3 = (img3 - m) / (0.000001 + sd); + + return img3; +} + +void FaceLandmarkDetector::InnerSeparateFacesToBuckets(std::vector& faceArr, std::vector& faceFrameArr, std::array& inOutBucketArr) +{ + static std::array>, MAX_FACE_COUNT> facesBelongsToSpace; + + + for (size_t i = 0; i < MAX_FACE_COUNT; i++) + { + facesBelongsToSpace[i].clear(); + } + + + //Distribute current faces to nearest old positions + for (size_t i = 0; i < faceArr.size(); ) + { + float lastDistance = 1000000.f; + int lastIndex = -1; + + for (size_t j = 0; j < MAX_FACE_COUNT; j++) + { + if (inOutBucketArr[j].valid) + { + float newDistance = calcSquaredDistanceBetweenFaces(inOutBucketArr[j].faceRect, faceArr[i]); + if (newDistance < lastDistance) + { + lastDistance = newDistance; + lastIndex = j; + } + } + } + + if (lastIndex != -1) + { + facesBelongsToSpace[lastIndex].push_back(std::make_pair(faceArr[i], faceFrameArr[i])); + faceArr.erase(faceArr.begin() + i); + faceFrameArr.erase(faceFrameArr.begin() + i); + } + else + { + i++; + } + } + + //Mark "free spots" to those that don't have any face belong to + for (size_t j = 0; j < MAX_FACE_COUNT; j++) + { + if (inOutBucketArr[j].valid) + { + if (facesBelongsToSpace[j].size() == 0) + { + inOutBucketArr[j].valid = false; + } + } + } + + //Find nearest face in each space - others return back to pool + for (size_t j = 0; j < MAX_FACE_COUNT; j++) + { + if (inOutBucketArr[j].valid) + { + float lastDistance = calcSquaredDistanceBetweenFaces(inOutBucketArr[j].faceRect, facesBelongsToSpace[j][0].first); + int lastIndex = 0; + + for (size_t i = 1; i < facesBelongsToSpace[j].size(); i++) + { + float newDistance = calcSquaredDistanceBetweenFaces(inOutBucketArr[j].faceRect, facesBelongsToSpace[j][i].first); + if (newDistance < lastDistance) + { + lastDistance = newDistance; + lastIndex = i; + } + } + + inOutBucketArr[j].faceRect = facesBelongsToSpace[j][lastIndex].first; + inOutBucketArr[j].faceFrame = facesBelongsToSpace[j][lastIndex].second; + + + facesBelongsToSpace[j].erase(facesBelongsToSpace[j].begin() + lastIndex); + + for (size_t k = 0; k < facesBelongsToSpace[j].size(); k++) + { + faceArr.push_back(facesBelongsToSpace[j][k].first); + faceFrameArr.push_back(facesBelongsToSpace[j][k].second); + } + } + } + + //Distribute faces from pool to empty slots + for (size_t j = 0; j < MAX_FACE_COUNT; j++) + { + if (!inOutBucketArr[j].valid) + { + + if (faceArr.size() > 0) + { + inOutBucketArr[j].valid = true; + + inOutBucketArr[j].faceRect = faceArr[0]; + inOutBucketArr[j].faceFrame = faceFrameArr[0]; + + + faceArr.erase(faceArr.begin()); + faceFrameArr.erase(faceFrameArr.begin()); + } + } + } + + +} \ No newline at end of file diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.h b/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.h new file mode 100755 index 0000000..528688b --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/FaceLandmarkDetector.h @@ -0,0 +1,111 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include + + +#include +#include +#include + + +#define USE_3D_LANDMARKS + + +//#include "boost/thread.hpp" + +constexpr size_t LANDMARK_POINT_COUNT = 68; + +constexpr size_t MAX_FACE_COUNT = 5; + + +struct FaceIntermediateStruct +{ + bool valid = false; + + cv::Rect faceRect; + cv::Mat faceFrame; + + int frameIndex; + +}; + + +struct FaceLandmarkStruct +{ + bool valid = false; + + cv::Rect faceRect; + std::array landmarkArr; + + int frameIndex; +}; + + +class FaceLandmarkDetector +{ +public: + FaceLandmarkDetector(); + ~FaceLandmarkDetector(); + + void StartTrackProcess(); + + void StopTrackProcess(); + + std::array GetFaceLandmarks(cv::Mat frame, int frameIndex); + +protected: + cv::dnn::Net faceNet; + + std::array landmarkNetArr; + + bool started = false; + + + //Sync variables - shared between threads: + + cv::Mat syncLastFrame; + + int syncLastFrameIndex; + + std::array syncFaceRectArr; + + std::array syncFaceLandmarkArr; + + std::mutex syncMutex; + + bool syncStop = false; + + std::condition_variable syncFaceRectCond; + + std::thread findFaceThread; + void FindFaceThreadProc(); + + std::array landmarkThreadArr; + void FindLandmarkThreadProc(size_t threadIndex); + + + + std::vector InnerFindFaces(cv::Mat frame); + + cv::Mat InnerCutFaceFrame(cv::Mat frame, cv::Rect faceRect); + + void InnerSeparateFacesToBuckets(std::vector& faceArr, std::vector& faceFrameArr, std::array& inOutBucketArr); + + +}; + diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.cpp b/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.cpp new file mode 100755 index 0000000..3f7edee --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.cpp @@ -0,0 +1,98 @@ +#include "ValueSmoother.h" + + +#include +#include + +using namespace std; + +using namespace std::chrono; + + +float snapCurve(float x) +{ + float y = 1.0 / (x + 1.0); + y = (1.0 - y) * 2.0; + if (y > 1.0) { + return 1.0; + } + return y; +} + + + +void ValueSmoother::reset() +{ + inited = false; +} + + +float ValueSmoother::responsiveAnalogReadSimple(float newValue) +{ + if (!inited) + { + inited = true; + smoothValue = newValue; + return smoothValue; + } + auto diff = abs(newValue - smoothValue); + float snap = snapCurve(diff * SNAP_MULTIPLIER_SIMPLE); + + smoothValue += (newValue - smoothValue) * snap; + return smoothValue; +} + + + + + + +void ExtendedValueSmoother::reset() +{ + inited = false; +} + +float ExtendedValueSmoother::responsiveAnalogRead(float newValue) +{ + using namespace std::chrono; + + auto ms = duration_cast(system_clock::now().time_since_epoch()).count(); + + + auto diff = abs(newValue - smoothValue); + + // measure the difference between the new value and current value over time + // to get a more reasonable indication of how far off the current smooth value is + // compared to the actual measurements + errorEMA += ((newValue - smoothValue) - errorEMA) * 0.4; + + // if sleep has been enabled, keep track of when we're asleep or not by marking the time of last activity and testing to see how much time has passed since then + if (SLEEP_ENABLE) { + // recalculate sleeping status + // (asleep if last activity was over SLEEP_DELAY_MS ago) + sleeping = abs(errorEMA) < ACTIVITY_THRESHOLD; + } + + + if (SLEEP_ENABLE && sleeping) { + return smoothValue; + } + + + + auto snap = snapCurve(diff * SNAP_MULTIPLIER); + + // when sleep is enabled, the emphasis is stopping on a responsiveValue quickly, and it's less about easing into position. If sleep is enabled, add a small amount to snap so it'll tend to snap into a more accurate position before sleeping starts. + if (SLEEP_ENABLE) { + snap = snap * 0.5 + 0.5; + } + + // calculate the exponential moving average based on the snap + smoothValue += (newValue - smoothValue) * snap; + + return smoothValue; + +} + + + diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.h b/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.h new file mode 100755 index 0000000..9770407 --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/ValueSmoother.h @@ -0,0 +1,49 @@ +#pragma once + + + +class ValueSmoother { +public: + + + void reset(); + + float responsiveAnalogReadSimple(float newValue); + +protected: + bool inited = false; + + //float SNAP_MULTIPLIER_SIMPLE = 1.0 / 60; + + float SNAP_MULTIPLIER_SIMPLE = 0.3; + + float smoothValue = 0; + +}; + + +struct ExtendedValueSmoother { +public: + void reset(); + + float responsiveAnalogRead(float newValue); + +protected: + + bool inited = false; + + float SNAP_MULTIPLIER = 1.0 / 200; + + float smoothValue = 0; + + bool SLEEP_ENABLE = true; + + float ACTIVITY_THRESHOLD = 16.0; + + float errorEMA = 0; + + long long lastActivityMS = 0; + + bool sleeping = false; + +}; \ No newline at end of file diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/VanFace.caffemodel b/windows/DoubleHitBalls-win/DoubleHitBalls-win/VanFace.caffemodel new file mode 100755 index 0000000..2b7343f Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/VanFace.caffemodel differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/deploy.prototxt b/windows/DoubleHitBalls-win/DoubleHitBalls-win/deploy.prototxt new file mode 100755 index 0000000..b4ca0a0 --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/deploy.prototxt @@ -0,0 +1,1789 @@ +input: "data" +input_shape { + dim: 1 + dim: 3 + dim: 300 + dim: 300 +} + +layer { + name: "data_bn" + type: "BatchNorm" + bottom: "data" + top: "data_bn" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "data_scale" + type: "Scale" + bottom: "data_bn" + top: "data_bn" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "conv1_h" + type: "Convolution" + bottom: "data_bn" + top: "conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "msra" + variance_norm: FAN_OUT + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv1_bn_h" + type: "BatchNorm" + bottom: "conv1_h" + top: "conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "conv1_scale_h" + type: "Scale" + bottom: "conv1_h" + top: "conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "conv1_relu" + type: "ReLU" + bottom: "conv1_h" + top: "conv1_h" +} +layer { + name: "conv1_pool" + type: "Pooling" + bottom: "conv1_h" + top: "conv1_pool" + pooling_param { + kernel_size: 3 + stride: 2 + } +} +layer { + name: "layer_64_1_conv1_h" + type: "Convolution" + bottom: "conv1_pool" + top: "layer_64_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_64_1_bn2_h" + type: "BatchNorm" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_64_1_scale2_h" + type: "Scale" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_64_1_relu2" + type: "ReLU" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" +} +layer { + name: "layer_64_1_conv2_h" + type: "Convolution" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv2_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_64_1_sum" + type: "Eltwise" + bottom: "layer_64_1_conv2_h" + bottom: "conv1_pool" + top: "layer_64_1_sum" +} +layer { + name: "layer_128_1_bn1_h" + type: "BatchNorm" + bottom: "layer_64_1_sum" + top: "layer_128_1_bn1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_128_1_scale1_h" + type: "Scale" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_bn1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_128_1_relu1" + type: "ReLU" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_bn1_h" +} +layer { + name: "layer_128_1_conv1_h" + type: "Convolution" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_bn2" + type: "BatchNorm" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_128_1_scale2" + type: "Scale" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_128_1_relu2" + type: "ReLU" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" +} +layer { + name: "layer_128_1_conv2" + type: "Convolution" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_conv_expand_h" + type: "Convolution" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_conv_expand_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_sum" + type: "Eltwise" + bottom: "layer_128_1_conv2" + bottom: "layer_128_1_conv_expand_h" + top: "layer_128_1_sum" +} +layer { + name: "layer_256_1_bn1" + type: "BatchNorm" + bottom: "layer_128_1_sum" + top: "layer_256_1_bn1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_256_1_scale1" + type: "Scale" + bottom: "layer_256_1_bn1" + top: "layer_256_1_bn1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_256_1_relu1" + type: "ReLU" + bottom: "layer_256_1_bn1" + top: "layer_256_1_bn1" +} +layer { + name: "layer_256_1_conv1" + type: "Convolution" + bottom: "layer_256_1_bn1" + top: "layer_256_1_conv1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_bn2" + type: "BatchNorm" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_256_1_scale2" + type: "Scale" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_256_1_relu2" + type: "ReLU" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" +} +layer { + name: "layer_256_1_conv2" + type: "Convolution" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_conv_expand" + type: "Convolution" + bottom: "layer_256_1_bn1" + top: "layer_256_1_conv_expand" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_sum" + type: "Eltwise" + bottom: "layer_256_1_conv2" + bottom: "layer_256_1_conv_expand" + top: "layer_256_1_sum" +} +layer { + name: "layer_512_1_bn1" + type: "BatchNorm" + bottom: "layer_256_1_sum" + top: "layer_512_1_bn1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_512_1_scale1" + type: "Scale" + bottom: "layer_512_1_bn1" + top: "layer_512_1_bn1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_512_1_relu1" + type: "ReLU" + bottom: "layer_512_1_bn1" + top: "layer_512_1_bn1" +} +layer { + name: "layer_512_1_conv1_h" + type: "Convolution" + bottom: "layer_512_1_bn1" + top: "layer_512_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 # 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_bn2_h" + type: "BatchNorm" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_512_1_scale2_h" + type: "Scale" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_512_1_relu2" + type: "ReLU" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" +} +layer { + name: "layer_512_1_conv2_h" + type: "Convolution" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv2_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 2 # 1 + kernel_size: 3 + stride: 1 + dilation: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_conv_expand_h" + type: "Convolution" + bottom: "layer_512_1_bn1" + top: "layer_512_1_conv_expand_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 1 # 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_sum" + type: "Eltwise" + bottom: "layer_512_1_conv2_h" + bottom: "layer_512_1_conv_expand_h" + top: "layer_512_1_sum" +} +layer { + name: "last_bn_h" + type: "BatchNorm" + bottom: "layer_512_1_sum" + top: "layer_512_1_sum" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "last_scale_h" + type: "Scale" + bottom: "layer_512_1_sum" + top: "layer_512_1_sum" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "last_relu" + type: "ReLU" + bottom: "layer_512_1_sum" + top: "fc7" +} + +layer { + name: "conv6_1_h" + type: "Convolution" + bottom: "fc7" + top: "conv6_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1_h" + top: "conv6_1_h" +} +layer { + name: "conv6_2_h" + type: "Convolution" + bottom: "conv6_1_h" + top: "conv6_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2_h" + top: "conv6_2_h" +} +layer { + name: "conv7_1_h" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv7_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1_h" + top: "conv7_1_h" +} +layer { + name: "conv7_2_h" + type: "Convolution" + bottom: "conv7_1_h" + top: "conv7_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2_h" + top: "conv7_2_h" +} +layer { + name: "conv8_1_h" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv8_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1_h" + top: "conv8_1_h" +} +layer { + name: "conv8_2_h" + type: "Convolution" + bottom: "conv8_1_h" + top: "conv8_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2_h" + top: "conv8_2_h" +} +layer { + name: "conv9_1_h" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv9_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_1_relu" + type: "ReLU" + bottom: "conv9_1_h" + top: "conv9_1_h" +} +layer { + name: "conv9_2_h" + type: "Convolution" + bottom: "conv9_1_h" + top: "conv9_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_relu" + type: "ReLU" + bottom: "conv9_2_h" + top: "conv9_2_h" +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "layer_256_1_bn1" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 30.0 + max_size: 60.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 8 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 60.0 + max_size: 111.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 16 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2_h" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 111.0 + max_size: 162.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 32 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2_h" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 162.0 + max_size: 213.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 64 + offset: 0.5 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2_h" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 213.0 + max_size: 264.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 100 + offset: 0.5 + } +} +layer { + name: "conv9_2_mbox_loc" + type: "Convolution" + bottom: "conv9_2_h" + top: "conv9_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_mbox_loc_perm" + type: "Permute" + bottom: "conv9_2_mbox_loc" + top: "conv9_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv9_2_mbox_loc_perm" + top: "conv9_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_conf" + type: "Convolution" + bottom: "conv9_2_h" + top: "conv9_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_mbox_conf_perm" + type: "Permute" + bottom: "conv9_2_mbox_conf" + top: "conv9_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv9_2_mbox_conf_perm" + top: "conv9_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv9_2_h" + bottom: "data" + top: "conv9_2_mbox_priorbox" + prior_box_param { + min_size: 264.0 + max_size: 315.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 300 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "conv9_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "conv9_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "conv9_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} + +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 2 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} + +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 2 + share_location: true + background_label_id: 0 + nms_param { + nms_threshold: 0.45 + top_k: 400 + } + code_type: CENTER_SIZE + keep_top_k: 200 + confidence_threshold: 0.01 + } +} diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa__iter_1400000.caffemodel b/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa__iter_1400000.caffemodel new file mode 100755 index 0000000..a56fa3c Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa__iter_1400000.caffemodel differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa_deploy.prototxt b/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa_deploy.prototxt new file mode 100755 index 0000000..6c91b15 --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/fa_deploy.prototxt @@ -0,0 +1,293 @@ +name: "CNNFacepoint" +layer { + name: "data" + type: "Input" + top: "data" + input_param { + shape: {dim: 1 dim: 1 dim: 40 dim: 40} + } +} + +layer { + name: "Conv1" + type: "Convolution" + bottom: "data" + top: "Conv1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + +layer { + name: "ActivationTangH1" + bottom: "Conv1" + top: "ActivationTangH1" + type: "TanH" +} + +layer { + name: "ActivationAbs1" + bottom: "ActivationTangH1" + top: "Abs1" + type: "AbsVal" +} + +layer { + name: "Pool1" + type: "Pooling" + bottom: "Abs1" + top: "Pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} + +layer { + name: "Conv2" + type: "Convolution" + bottom: "Pool1" + top: "Conv2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + +layer { + name: "ActivationTangH2" + bottom: "Conv2" + top: "ActivationTangH2" + type: "TanH" +} + +layer { + name: "ActivationAbs2" + bottom: "ActivationTangH2" + top: "Abs2" + type: "AbsVal" +} + + +layer { + name: "Pool2" + type: "Pooling" + bottom: "Abs2" + top: "Pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} + +# layer 3 +layer { + name: "Conv3" + type: "Convolution" + bottom: "Pool2" + top: "Conv3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + + +layer { + name: "ActivationTangH3" + bottom: "Conv3" + top: "ActivationTangH3" + type: "TanH" +} + +layer { + name: "ActivationAbs3" + bottom: "ActivationTangH3" + top: "Abs3" + type: "AbsVal" +} + +layer { + name: "Pool3" + type: "Pooling" + bottom: "Abs3" + top: "Pool3" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} + +# layer 4 +layer { + name: "Conv4" + type: "Convolution" + bottom: "Pool3" + top: "Conv4" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 2 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + + +layer { + name: "ActivationTangH4" + bottom: "Conv4" + top: "ActivationTangH4" + type: "TanH" +} + +layer { + name: "ActivationAbs4" + bottom: "ActivationTangH4" + top: "Abs4" + type: "AbsVal" +} + + +######################################## + +layer { + name: "Dense1" + type: "InnerProduct" + bottom: "Abs4" + top: "Dense1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 100 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} + + +layer { + name: "ActivationTangH5" + bottom: "Dense1" + top: "ActivationTangH5" + type: "TanH" +} + +layer { + name: "ActivationAbs5" + bottom: "ActivationTangH5" + top: "Abs5" + type: "AbsVal" +} + + +layer { + name: "Dense2" + type: "InnerProduct" + bottom: "Abs5" + top: "Dense2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 136 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} + + diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/landmark_deploy.prototxt b/windows/DoubleHitBalls-win/DoubleHitBalls-win/landmark_deploy.prototxt new file mode 100755 index 0000000..94f526b --- /dev/null +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/landmark_deploy.prototxt @@ -0,0 +1,292 @@ +name: "landmark" +input: "data" +input_shape { + dim: 1 + dim: 1 + dim: 60 + dim: 60 +} +######################################## +# the actual net +# layer 1 +layer { + name: "Conv1" + type: "Convolution" + bottom: "data" + top: "Conv1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 20 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + +layer { + name: "ActivationTangH1" + bottom: "Conv1" + top: "ActivationTangH1" + type: "TanH" +} + +layer { + name: "ActivationAbs1" + bottom: "ActivationTangH1" + top: "Abs1" + type: "AbsVal" +} + +layer { + name: "Pool1" + type: "Pooling" + bottom: "Abs1" + top: "Pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} + +layer { + name: "Conv2" + type: "Convolution" + bottom: "Pool1" + top: "Conv2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + +layer { + name: "ActivationTangH2" + bottom: "Conv2" + top: "ActivationTangH2" + type: "TanH" +} + +layer { + name: "ActivationAbs2" + bottom: "ActivationTangH2" + top: "Abs2" + type: "AbsVal" +} + + +layer { + name: "Pool2" + type: "Pooling" + bottom: "Abs2" + top: "Pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} + +# layer 3 +layer { + name: "Conv3" + type: "Convolution" + bottom: "Pool2" + top: "Conv3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + + +layer { + name: "ActivationTangH3" + bottom: "Conv3" + top: "ActivationTangH3" + type: "TanH" +} + +layer { + name: "ActivationAbs3" + bottom: "ActivationTangH3" + top: "Abs3" + type: "AbsVal" +} + +layer { + name: "Pool3" + type: "Pooling" + bottom: "Abs3" + top: "Pool3" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} + +# layer 4 +layer { + name: "Conv4" + type: "Convolution" + bottom: "Pool3" + top: "Conv4" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 80 + pad: 0 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} + + +layer { + name: "ActivationTangH4" + bottom: "Conv4" + top: "ActivationTangH4" + type: "TanH" +} + +layer { + name: "ActivationAbs4" + bottom: "ActivationTangH4" + top: "Abs4" + type: "AbsVal" +} + + +######################################## + +layer { + name: "Dense1" + type: "InnerProduct" + bottom: "Abs4" + top: "Dense1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 512 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} + + +layer { + name: "ActivationTangH5" + bottom: "Dense1" + top: "ActivationTangH5" + type: "TanH" +} + +layer { + name: "ActivationAbs5" + bottom: "ActivationTangH5" + top: "Abs5" + type: "AbsVal" +} + + +layer { + name: "Dense3" + type: "InnerProduct" + bottom: "Abs5" + top: "Dense3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + inner_product_param { + num_output: 136 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp b/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp index 3f248c6..acfee0f 100755 --- a/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp +++ b/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp @@ -4,14 +4,17 @@ TMyApplication* App = NULL; + + + int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow) { - int width = 480; - int height = 320; - + int width = 1280; + int height = 720; + if (CreateEngine(width, height)) { @@ -30,5 +33,6 @@ int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, DestroyEngine(); } + return 0; } \ No newline at end of file diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_core341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_core341.dll new file mode 100755 index 0000000..6695b5a Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_core341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_cudev341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_cudev341.dll new file mode 100755 index 0000000..3c343e3 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_cudev341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_dnn341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_dnn341.dll new file mode 100755 index 0000000..e7cb0db Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_dnn341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_ffmpeg341_64.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_ffmpeg341_64.dll new file mode 100755 index 0000000..cb14e29 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_ffmpeg341_64.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_highgui341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_highgui341.dll new file mode 100755 index 0000000..71060b0 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_highgui341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgcodecs341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgcodecs341.dll new file mode 100755 index 0000000..0d07ea1 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgcodecs341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgproc341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgproc341.dll new file mode 100755 index 0000000..4b75514 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_imgproc341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_objdetect341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_objdetect341.dll new file mode 100755 index 0000000..ced98b4 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_objdetect341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_video341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_video341.dll new file mode 100755 index 0000000..cbccdce Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_video341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_videoio341.dll b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_videoio341.dll new file mode 100755 index 0000000..9079b2a Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/opencv_videoio341.dll differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/res10_300x300_ssd_iter_140000.caffemodel b/windows/DoubleHitBalls-win/DoubleHitBalls-win/res10_300x300_ssd_iter_140000.caffemodel new file mode 100755 index 0000000..809dfd7 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/res10_300x300_ssd_iter_140000.caffemodel differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/result.jpg b/windows/DoubleHitBalls-win/DoubleHitBalls-win/result.jpg new file mode 100755 index 0000000..06db1a1 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/result.jpg differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/video.mp4 b/windows/DoubleHitBalls-win/DoubleHitBalls-win/video.mp4 new file mode 100755 index 0000000..4d14214 Binary files /dev/null and b/windows/DoubleHitBalls-win/DoubleHitBalls-win/video.mp4 differ diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win.sln b/windows/DoubleHitBalls-win/TorchFaceTracker.sln similarity index 100% rename from windows/DoubleHitBalls-win/DoubleHitBalls-win.sln rename to windows/DoubleHitBalls-win/TorchFaceTracker.sln