First operational implementation of Displays View

This commit is contained in:
Bruno Herbelin
2022-12-29 00:39:51 +01:00
parent fb6a95078d
commit 784ac996d3
15 changed files with 1073 additions and 650 deletions

View File

@@ -563,7 +563,7 @@ set(VMIX_RSC_FILES
./rsc/mesh/icon_crop.ply ./rsc/mesh/icon_crop.ply
./rsc/mesh/icon_eye.ply ./rsc/mesh/icon_eye.ply
./rsc/mesh/icon_eye_slash.ply ./rsc/mesh/icon_eye_slash.ply
./rsc/mesh/icon_vector_square_slash.ply ./rsc/mesh/icon_tv.ply
./rsc/mesh/icon_cube.ply ./rsc/mesh/icon_cube.ply
./rsc/mesh/icon_sequence.ply ./rsc/mesh/icon_sequence.ply
./rsc/mesh/icon_receive.ply ./rsc/mesh/icon_receive.ply

580
rsc/mesh/icon_tv.ply Normal file
View File

@@ -0,0 +1,580 @@
ply
format ascii 1.0
comment Created by Blender 3.2.2 - www.blender.org
element vertex 285
property float x
property float y
property float z
element face 285
property list uchar uint vertex_indices
end_header
-0.169188 -0.075740 0.000000
-0.169243 -0.070732 0.000000
-0.169243 -0.074063 0.000000
-0.169243 -0.061524 0.000000
-0.169243 -0.047614 0.000000
-0.169243 -0.030177 0.000000
-0.169243 -0.010389 0.000000
-0.169243 0.010574 0.000000
-0.169243 0.031537 0.000000
-0.169243 0.051325 0.000000
-0.169243 0.068762 0.000000
-0.169243 0.082672 0.000000
-0.169243 0.091880 0.000000
-0.169243 0.095211 0.000000
-0.169188 0.096888 0.000000
-0.169023 -0.077400 0.000000
-0.169023 0.098548 0.000000
-0.168751 -0.079040 0.000000
-0.168751 0.100187 0.000000
-0.168373 -0.080652 0.000000
-0.168373 0.101800 0.000000
-0.167892 -0.082234 0.000000
-0.167892 0.103382 0.000000
-0.167310 -0.083780 0.000000
-0.167310 0.104927 0.000000
-0.166629 -0.085284 0.000000
-0.166629 0.106432 0.000000
-0.165850 -0.086742 0.000000
-0.165850 0.107890 0.000000
-0.164976 -0.088150 0.000000
-0.164976 0.109298 0.000000
-0.164010 0.110649 0.000000
-0.164010 -0.089501 0.000000
-0.162952 0.111940 0.000000
-0.162952 -0.090792 0.000000
-0.161805 0.113165 0.000000
-0.161805 -0.092017 0.000000
-0.160580 0.114312 0.000000
-0.160580 -0.093164 0.000000
-0.159289 0.115369 0.000000
-0.159289 -0.094221 0.000000
-0.157937 0.116336 0.000000
-0.157937 -0.095188 0.000000
-0.156529 0.117209 0.000000
-0.156529 -0.096062 0.000000
-0.155070 0.117988 0.000000
-0.155070 -0.096840 0.000000
-0.153566 0.118669 0.000000
-0.153566 -0.097521 0.000000
-0.152020 0.119251 0.000000
-0.152020 -0.098103 0.000000
-0.150438 0.119732 0.000000
-0.150438 -0.098584 0.000000
-0.149867 0.100208 0.000000
-0.148825 0.120109 0.000000
-0.148825 -0.098962 0.000000
-0.149867 -0.079856 0.000000
0.150125 0.100208 0.000000
0.150125 -0.079856 0.000000
-0.147185 0.120382 0.000000
-0.147185 -0.099234 0.000000
-0.145524 0.120546 0.000000
-0.145524 -0.099399 0.000000
-0.143847 0.120602 0.000000
-0.143847 -0.099454 0.000000
0.143979 0.120602 0.000000
-0.141348 -0.099454 0.000000
-0.134441 -0.099454 0.000000
-0.124006 -0.099454 0.000000
-0.110926 -0.099454 0.000000
-0.118432 -0.126889 0.000000
-0.118451 -0.126468 0.000000
-0.118451 -0.126625 0.000000
-0.118451 -0.126034 0.000000
-0.118451 -0.125379 0.000000
-0.118451 -0.124557 0.000000
-0.118451 -0.123624 0.000000
-0.118451 -0.122636 0.000000
-0.118451 -0.121647 0.000000
-0.118451 -0.120715 0.000000
-0.118451 -0.119893 0.000000
-0.118451 -0.119237 0.000000
-0.118451 -0.118803 0.000000
-0.118451 -0.118646 0.000000
-0.118432 -0.118382 0.000000
-0.118377 -0.127150 0.000000
-0.118377 -0.118122 0.000000
-0.118286 -0.127407 0.000000
-0.118286 -0.117864 0.000000
-0.118160 -0.127661 0.000000
-0.118160 -0.117611 0.000000
-0.118000 -0.127909 0.000000
-0.118000 -0.117362 0.000000
-0.117806 -0.128152 0.000000
-0.117806 -0.117119 0.000000
-0.117579 -0.128388 0.000000
-0.117579 -0.116883 0.000000
-0.117319 -0.128618 0.000000
-0.117319 -0.116654 0.000000
-0.117028 -0.128839 0.000000
-0.117028 -0.116433 0.000000
-0.116706 -0.129051 0.000000
-0.116706 -0.116220 0.000000
-0.116353 -0.129254 0.000000
-0.116353 -0.116017 0.000000
-0.115971 -0.129446 0.000000
-0.115971 -0.115825 0.000000
-0.115563 -0.129627 0.000000
-0.115563 -0.115645 0.000000
-0.115132 -0.129793 0.000000
-0.115132 -0.115479 0.000000
-0.114682 -0.129945 0.000000
-0.114682 -0.115327 0.000000
-0.114212 -0.130082 0.000000
-0.114212 -0.115189 0.000000
-0.113726 -0.130204 0.000000
-0.113726 -0.115067 0.000000
-0.113225 -0.130311 0.000000
-0.113225 -0.114960 0.000000
-0.112709 -0.130403 0.000000
-0.112709 -0.114869 0.000000
-0.112182 -0.130478 0.000000
-0.112182 -0.114793 0.000000
-0.111644 -0.130538 0.000000
-0.111644 -0.114734 0.000000
-0.111098 -0.130580 0.000000
-0.111098 -0.114691 0.000000
-0.110544 -0.130606 0.000000
-0.110544 -0.114665 0.000000
-0.096082 -0.099454 0.000000
-0.109985 -0.130615 0.000000
-0.109985 -0.114656 0.000000
-0.105654 -0.130615 0.000000
-0.016865 -0.114656 0.000000
-0.093681 -0.130615 0.000000
-0.080356 -0.099454 0.000000
-0.075594 -0.130615 0.000000
-0.064630 -0.099454 0.000000
-0.052921 -0.130615 0.000000
-0.049786 -0.099454 0.000000
-0.027192 -0.130615 0.000000
-0.036706 -0.099454 0.000000
-0.026271 -0.099454 0.000000
0.000066 -0.130615 0.000000
-0.019363 -0.099454 0.000000
-0.016865 -0.099454 0.000000
0.016997 -0.099454 0.000000
0.027324 -0.130615 0.000000
0.016997 -0.114656 0.000000
0.143979 -0.099454 0.000000
0.018829 -0.114656 0.000000
0.023895 -0.114656 0.000000
0.031547 -0.114656 0.000000
0.053054 -0.130615 0.000000
0.041139 -0.114656 0.000000
0.052025 -0.114656 0.000000
0.063557 -0.114656 0.000000
0.075726 -0.130615 0.000000
0.075089 -0.114656 0.000000
0.085975 -0.114656 0.000000
0.093813 -0.130615 0.000000
0.095567 -0.114656 0.000000
0.105786 -0.130615 0.000000
0.103219 -0.114656 0.000000
0.108285 -0.114656 0.000000
0.110117 -0.130615 0.000000
0.110117 -0.114656 0.000000
0.110676 -0.114665 0.000000
0.110676 -0.130606 0.000000
0.111230 -0.114691 0.000000
0.111230 -0.130580 0.000000
0.111776 -0.114734 0.000000
0.111776 -0.130538 0.000000
0.112314 -0.114793 0.000000
0.112314 -0.130478 0.000000
0.112842 -0.114869 0.000000
0.112842 -0.130403 0.000000
0.113357 -0.114960 0.000000
0.113357 -0.130311 0.000000
0.113858 -0.115067 0.000000
0.113858 -0.130204 0.000000
0.114345 -0.115189 0.000000
0.114345 -0.130082 0.000000
0.114814 -0.115327 0.000000
0.114814 -0.129945 0.000000
0.115264 -0.115479 0.000000
0.115264 -0.129793 0.000000
0.115695 -0.115645 0.000000
0.115695 -0.129627 0.000000
0.116103 -0.115825 0.000000
0.116103 -0.129446 0.000000
0.116485 -0.116017 0.000000
0.116485 -0.129254 0.000000
0.116838 -0.116220 0.000000
0.116838 -0.129051 0.000000
0.117160 -0.116433 0.000000
0.117160 -0.128839 0.000000
0.117452 -0.116654 0.000000
0.117452 -0.128618 0.000000
0.117711 -0.116883 0.000000
0.117711 -0.128388 0.000000
0.117938 -0.117119 0.000000
0.117938 -0.128152 0.000000
0.118132 -0.117362 0.000000
0.118132 -0.127909 0.000000
0.118293 -0.117611 0.000000
0.118293 -0.127661 0.000000
0.118419 -0.117864 0.000000
0.118419 -0.127407 0.000000
0.118509 -0.118122 0.000000
0.118509 -0.127150 0.000000
0.118564 -0.118383 0.000000
0.118564 -0.126889 0.000000
0.118583 -0.118646 0.000000
0.118583 -0.126625 0.000000
0.118583 -0.126468 0.000000
0.118583 -0.126034 0.000000
0.118583 -0.125379 0.000000
0.118583 -0.124557 0.000000
0.118583 -0.123624 0.000000
0.118583 -0.122636 0.000000
0.118583 -0.121647 0.000000
0.118583 -0.120715 0.000000
0.118583 -0.119893 0.000000
0.118583 -0.119237 0.000000
0.118583 -0.118803 0.000000
0.145656 0.120546 0.000000
0.145656 -0.099399 0.000000
0.147317 0.120382 0.000000
0.147317 -0.099234 0.000000
0.148957 0.120109 0.000000
0.148957 -0.098962 0.000000
0.150570 0.119732 0.000000
0.150570 -0.098584 0.000000
0.152152 0.119251 0.000000
0.152152 -0.098103 0.000000
0.153698 0.118669 0.000000
0.153698 -0.097521 0.000000
0.155203 0.117988 0.000000
0.155203 -0.096840 0.000000
0.156661 0.117209 0.000000
0.156661 -0.096062 0.000000
0.158069 0.116336 0.000000
0.158069 -0.095188 0.000000
0.159421 0.115369 0.000000
0.159421 -0.094221 0.000000
0.160712 0.114312 0.000000
0.160712 -0.093164 0.000000
0.161937 0.113165 0.000000
0.161937 -0.092017 0.000000
0.163084 0.111940 0.000000
0.163084 -0.090792 0.000000
0.164142 0.110649 0.000000
0.164142 -0.089501 0.000000
0.165109 0.109298 0.000000
0.165109 -0.088150 0.000000
0.165982 0.107890 0.000000
0.165982 -0.086742 0.000000
0.166761 0.106432 0.000000
0.166761 -0.085284 0.000000
0.167442 0.104927 0.000000
0.167442 -0.083780 0.000000
0.168025 0.103382 0.000000
0.168025 -0.082234 0.000000
0.168505 0.101800 0.000000
0.168505 -0.080652 0.000000
0.168883 0.100187 0.000000
0.168883 -0.079040 0.000000
0.169155 0.098548 0.000000
0.169155 -0.077400 0.000000
0.169320 0.096888 0.000000
0.169320 -0.075740 0.000000
0.169376 0.095211 0.000000
0.169376 -0.074063 0.000000
0.169376 0.091880 0.000000
0.169376 -0.070732 0.000000
0.169376 -0.061524 0.000000
0.169376 -0.047614 0.000000
0.169376 -0.030177 0.000000
0.169376 -0.010389 0.000000
0.169376 0.010574 0.000000
0.169376 0.031537 0.000000
0.169376 0.051325 0.000000
0.169376 0.068762 0.000000
0.169376 0.082672 0.000000
3 0 1 2
3 0 3 1
3 0 4 3
3 0 5 4
3 0 6 5
3 0 7 6
3 0 8 7
3 0 9 8
3 0 10 9
3 0 11 10
3 0 12 11
3 0 13 12
3 0 14 13
3 15 14 0
3 15 16 14
3 17 16 15
3 17 18 16
3 19 18 17
3 19 20 18
3 21 20 19
3 21 22 20
3 23 22 21
3 23 24 22
3 25 24 23
3 25 26 24
3 27 26 25
3 27 28 26
3 29 28 27
3 29 30 28
3 29 31 30
3 32 31 29
3 32 33 31
3 34 33 32
3 34 35 33
3 36 35 34
3 36 37 35
3 38 37 36
3 38 39 37
3 40 39 38
3 40 41 39
3 42 41 40
3 42 43 41
3 44 43 42
3 44 45 43
3 46 45 44
3 46 47 45
3 48 47 46
3 48 49 47
3 50 49 48
3 50 51 49
3 52 51 50
3 52 53 51
3 53 54 51
3 55 56 52
3 56 53 52
3 57 54 53
3 55 58 56
3 57 59 54
3 60 58 55
3 57 61 59
3 62 58 60
3 57 63 61
3 64 58 62
3 57 65 63
3 66 58 64
3 67 58 66
3 68 58 67
3 69 58 68
3 70 71 72
3 70 73 71
3 70 74 73
3 70 75 74
3 70 76 75
3 70 77 76
3 70 78 77
3 70 79 78
3 70 80 79
3 70 81 80
3 70 82 81
3 70 83 82
3 70 84 83
3 85 84 70
3 85 86 84
3 87 86 85
3 87 88 86
3 89 88 87
3 89 90 88
3 91 90 89
3 91 92 90
3 93 92 91
3 93 94 92
3 95 94 93
3 95 96 94
3 97 96 95
3 97 98 96
3 99 98 97
3 99 100 98
3 101 100 99
3 101 102 100
3 103 102 101
3 103 104 102
3 105 104 103
3 105 106 104
3 107 106 105
3 107 108 106
3 109 108 107
3 109 110 108
3 111 110 109
3 111 112 110
3 113 112 111
3 113 114 112
3 115 114 113
3 115 116 114
3 117 116 115
3 117 118 116
3 119 118 117
3 119 120 118
3 121 120 119
3 121 122 120
3 123 122 121
3 123 124 122
3 125 124 123
3 125 126 124
3 127 126 125
3 127 128 126
3 129 58 69
3 130 128 127
3 130 131 128
3 132 131 130
3 132 133 131
3 134 133 132
3 135 58 129
3 136 133 134
3 137 58 135
3 138 133 136
3 139 58 137
3 140 133 138
3 141 58 139
3 142 58 141
3 143 133 140
3 144 58 142
3 145 58 144
3 143 145 133
3 143 146 145
3 146 58 145
3 147 148 143
3 148 146 143
3 149 58 146
3 147 150 148
3 147 151 150
3 147 152 151
3 153 152 147
3 153 154 152
3 153 155 154
3 153 156 155
3 157 156 153
3 157 158 156
3 157 159 158
3 160 159 157
3 160 161 159
3 162 161 160
3 162 163 161
3 162 164 163
3 165 164 162
3 165 166 164
3 165 167 166
3 168 167 165
3 168 169 167
3 170 169 168
3 170 171 169
3 172 171 170
3 172 173 171
3 174 173 172
3 174 175 173
3 176 175 174
3 176 177 175
3 178 177 176
3 178 179 177
3 180 179 178
3 180 181 179
3 182 181 180
3 182 183 181
3 184 183 182
3 184 185 183
3 186 185 184
3 186 187 185
3 188 187 186
3 188 189 187
3 190 189 188
3 190 191 189
3 192 191 190
3 192 193 191
3 194 193 192
3 194 195 193
3 196 195 194
3 196 197 195
3 198 197 196
3 198 199 197
3 200 199 198
3 200 201 199
3 202 201 200
3 202 203 201
3 204 203 202
3 204 205 203
3 206 205 204
3 206 207 205
3 208 207 206
3 208 209 207
3 210 209 208
3 210 211 209
3 212 211 210
3 212 213 211
3 214 213 212
3 215 213 214
3 216 213 215
3 217 213 216
3 218 213 217
3 219 213 218
3 220 213 219
3 221 213 220
3 222 213 221
3 223 213 222
3 224 213 223
3 225 213 224
3 57 226 65
3 227 58 149
3 57 228 226
3 229 58 227
3 57 230 228
3 231 58 229
3 57 232 230
3 233 58 231
3 233 57 58
3 233 232 57
3 233 234 232
3 235 234 233
3 235 236 234
3 237 236 235
3 237 238 236
3 239 238 237
3 239 240 238
3 241 240 239
3 241 242 240
3 243 242 241
3 243 244 242
3 245 244 243
3 245 246 244
3 247 246 245
3 247 248 246
3 249 248 247
3 249 250 248
3 251 250 249
3 251 252 250
3 253 252 251
3 253 254 252
3 255 254 253
3 255 256 254
3 257 256 255
3 257 258 256
3 259 258 257
3 259 260 258
3 261 260 259
3 261 262 260
3 263 262 261
3 263 264 262
3 265 264 263
3 265 266 264
3 267 266 265
3 267 268 266
3 269 268 267
3 269 270 268
3 271 270 269
3 271 272 270
3 273 272 271
3 273 274 272
3 275 274 273
3 276 274 275
3 277 274 276
3 278 274 277
3 279 274 278
3 280 274 279
3 281 274 280
3 282 274 281
3 283 274 282
3 284 274 283

View File

@@ -220,6 +220,7 @@ Handles::Handles(Type type) : Node(), type_(type)
static Mesh *handle_menu = new Mesh("mesh/border_handles_menu.ply"); static Mesh *handle_menu = new Mesh("mesh/border_handles_menu.ply");
static Mesh *handle_lock = new Mesh("mesh/border_handles_lock.ply"); static Mesh *handle_lock = new Mesh("mesh/border_handles_lock.ply");
static Mesh *handle_unlock = new Mesh("mesh/border_handles_lock_open.ply"); static Mesh *handle_unlock = new Mesh("mesh/border_handles_lock_open.ply");
static Mesh *handle_eyeslash = new Mesh("mesh/icon_eye_slash.ply");
static Mesh *handle_shadow = new Mesh("mesh/border_handles_shadow.ply", "images/soft_shadow.dds"); static Mesh *handle_shadow = new Mesh("mesh/border_handles_shadow.ply", "images/soft_shadow.dds");
if ( type_ == Handles::ROTATE ) { if ( type_ == Handles::ROTATE ) {
@@ -240,6 +241,9 @@ Handles::Handles(Type type) : Node(), type_(type)
else if ( type_ == Handles::UNLOCKED ) { else if ( type_ == Handles::UNLOCKED ) {
handle_ = handle_unlock; handle_ = handle_unlock;
} }
else if ( type_ == Handles::EYESLASHED ) {
handle_ = handle_eyeslash;
}
else { else {
handle_ = handle_corner; handle_ = handle_corner;
} }
@@ -371,7 +375,7 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
// 1. Fixed displacement by (0.12,0.12) along the rotation.. // 1. Fixed displacement by (0.12,0.12) along the rotation..
ctm = GlmToolkit::transform(glm::vec4(0.f), rot, mirror); ctm = GlmToolkit::transform(glm::vec4(0.f), rot, mirror);
glm::vec4 pos = ctm * glm::vec4(mirror.x * 0.12f, mirror.x * 0.12f, 0.f, 1.f); glm::vec4 pos = ctm * glm::vec4(mirror.x * 0.12f, mirror.x * 0.12f, 0.f, 1.f);
// 2. ..from the bottom right corner (1,-1) // 2. ..from the bottom left corner (-1,-1)
vec = ( modelview * glm::vec4(-1.f, -1.f, 0.f, 1.f) ) + pos; vec = ( modelview * glm::vec4(-1.f, -1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, mirror); ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw // 3. draw
@@ -402,6 +406,18 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
shadow_->draw( ctm, projection ); shadow_->draw( ctm, projection );
handle_->draw( ctm, projection ); handle_->draw( ctm, projection );
} }
else if ( type_ == Handles::EYESLASHED ){
// one icon in bottom right corner
// 1. Fixed displacement by (0.12,0.12) along the rotation..
ctm = GlmToolkit::transform(glm::vec4(0.f), rot, mirror);
glm::vec4 pos = ctm * glm::vec4(mirror.x * 0.15f, mirror.x * 0.15f, 0.f, 1.f);
// 2. ..from the bottom left corner (-1,-1)
vec = ( modelview * glm::vec4(-1.f, -1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw
shadow_->draw( ctm, projection );
handle_->draw( ctm, projection );
}
} }
} }
@@ -459,8 +475,8 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
shadows[EYE] = shadow; shadows[EYE] = shadow;
icons[EYESLASH] = new Mesh("mesh/icon_eye_slash.ply"); icons[EYESLASH] = new Mesh("mesh/icon_eye_slash.ply");
shadows[EYESLASH] = shadow; shadows[EYESLASH] = shadow;
icons[VECTORSLASH] = new Mesh("mesh/icon_vector_square_slash.ply"); icons[TELEVISION] = new Mesh("mesh/icon_tv.ply");
shadows[VECTORSLASH] = shadow; shadows[TELEVISION] = shadow;
icons[ARROWS] = new Mesh("mesh/icon_rightarrow.ply"); icons[ARROWS] = new Mesh("mesh/icon_rightarrow.ply");
shadows[ARROWS] = shadow; shadows[ARROWS] = shadow;
icons[ROTATION] = new Mesh("mesh/border_handles_rotation.ply"); icons[ROTATION] = new Mesh("mesh/border_handles_rotation.ply");

View File

@@ -36,7 +36,7 @@ protected:
class Handles : public Node class Handles : public Node
{ {
public: public:
typedef enum { RESIZE = 0, RESIZE_H, RESIZE_V, ROTATE, SCALE, CROP, MENU, LOCKED, UNLOCKED } Type; typedef enum { RESIZE = 0, RESIZE_H, RESIZE_V, ROTATE, SCALE, CROP, MENU, LOCKED, UNLOCKED, EYESLASHED } Type;
Handles(Type type); Handles(Type type);
~Handles(); ~Handles();
@@ -61,7 +61,7 @@ class Symbol : public Node
{ {
public: public:
typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, SEQUENCE, VIDEO, SESSION, CLONE, RENDER, GROUP, PATTERN, CAMERA, CUBE, SHARE, RECEIVE, typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, SEQUENCE, VIDEO, SESSION, CLONE, RENDER, GROUP, PATTERN, CAMERA, CUBE, SHARE, RECEIVE,
DOTS, BUSY, LOCK, UNLOCK, EYE, EYESLASH, VECTORSLASH, ARROWS, ROTATION, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type; DOTS, BUSY, LOCK, UNLOCK, EYE, EYESLASH, TELEVISION, ARROWS, ROTATION, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type;
Symbol(Type t, glm::vec3 pos = glm::vec3(0.f)); Symbol(Type t, glm::vec3 pos = glm::vec3(0.f));
~Symbol(); ~Symbol();

File diff suppressed because it is too large Load Diff

View File

@@ -16,34 +16,44 @@ public:
void resize (int) override; void resize (int) override;
int size () override; int size () override;
bool canSelect(Source *) override; bool canSelect(Source *) override;
void select(glm::vec2 A, glm::vec2 B) override;
void recenter () override; void recenter () override;
std::pair<Node *, glm::vec2> pick(glm::vec2 P) override; std::pair<Node *, glm::vec2> pick(glm::vec2 P) override;
void initiate () override;
void terminate (bool force = false) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override; Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
void terminate(bool force) override;
void arrow (glm::vec2) override; void arrow (glm::vec2) override;
glm::ivec4 outputCoordinates() const;
private: private:
Group *output_;
Group *output_status_;
Surface *output_surface_; Surface *output_surface_;
Node *overlay_position_; Surface *output_render_;
Node *overlay_position_cross_; Switch *output_overlays_;
Symbol *overlay_rotation_; Switch *output_mode_;
Symbol *overlay_rotation_fix_; Handles *output_handles_;
Group *overlay_rotation_clock_; Handles *output_menu_;
Symbol *overlay_rotation_clock_tic_; Handles *output_visible_;
Node *overlay_rotation_clock_hand_; Symbol *output_fullscreen_;
Symbol *overlay_scaling_;
Symbol *overlay_scaling_cross_;
Node *overlay_scaling_grid_;
Node *overlay_crop_;
void updateSelectionOverlay() override; bool output_selected_;
bool overlay_selection_active_; bool show_output_menu_;
Group *overlay_selection_stored_status_;
Handles *overlay_selection_scale_;
Handles *overlay_selection_rotate_;
void applySelectionTransform(glm::mat4 M); // Node *overlay_position_;
// Node *overlay_position_cross_;
// Symbol *overlay_rotation_;
// Symbol *overlay_rotation_fix_;
// Group *overlay_rotation_clock_;
// Symbol *overlay_rotation_clock_tic_;
// Node *overlay_rotation_clock_hand_;
// Symbol *overlay_scaling_;
// Symbol *overlay_scaling_cross_;
// Node *overlay_scaling_grid_;
// Node *overlay_crop_;
}; };

View File

@@ -330,7 +330,7 @@ void GeometryView::draw()
// colored context menu // colored context menu
ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor()); ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor());
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.36f, 0.36f, 0.36f, 0.44f)); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(COLOR_MENU_HOVERED, 0.5f));
// batch manipulation of sources in Geometry view // batch manipulation of sources in Geometry view
if (ImGui::Selectable( ICON_FA_EXPAND " Fit all" )){ if (ImGui::Selectable( ICON_FA_EXPAND " Fit all" )){

View File

@@ -116,7 +116,7 @@ void LayerView::draw()
// colored context menu // colored context menu
ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor()); ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor());
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.36f, 0.36f, 0.36f, 0.44f)); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(COLOR_MENU_HOVERED, 0.5f));
// special action of Mixing view // special action of Mixing view
if (candidate_flatten_group){ if (candidate_flatten_group){

View File

@@ -169,7 +169,7 @@ void MixingView::draw()
// colored context menu // colored context menu
ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor()); ImGui::PushStyleColor(ImGuiCol_Text, ImGuiToolkit::HighlightColor());
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.36f, 0.36f, 0.36f, 0.44f)); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(COLOR_MENU_HOVERED, 0.5f));
// special action of Mixing view: link or unlink // special action of Mixing view: link or unlink
SourceList selected = Mixer::selection().getCopy(); SourceList selected = Mixer::selection().getCopy();

View File

@@ -160,17 +160,25 @@ static void WindowMoveCallback( GLFWwindow *w, int x, int y)
} }
} }
static void WindowToggleFullscreen( GLFWwindow *w, int button, int action, int) static void OutputWindowEvent( GLFWwindow *w, int button, int action, int)
{ {
// detect mouse press
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{ {
static double seconds = 0.f; static double seconds = 0.f;
// detect double clic // detect double clic
if ( glfwGetTime() - seconds < 0.2f ) { if ( glfwGetTime() - seconds < 0.2f ) {
// toggle fullscreen
GLFW_window_[w]->toggleFullscreen(); // exit fullscreen if its the case
if (glfwGetWindowMonitor(w) != nullptr)
Rendering::manager().outputWindow().exitFullscreen();
// show main window in DISPLAYS view to
// indicate how to manipulate output window
Mixer::manager().setView(View::DISPLAYS);
Rendering::manager().mainWindow().show();
} }
// for next clic detection // for next double clic detection
seconds = glfwGetTime(); seconds = glfwGetTime();
} }
} }
@@ -184,7 +192,7 @@ static void WindowCloseCallback( GLFWwindow* w )
void Rendering::MonitorConnect(GLFWmonitor* monitor, int event) void Rendering::MonitorConnect(GLFWmonitor* monitor, int event)
{ {
// reset list of monitors // reset list of monitors
Rendering::manager().monitors_.clear(); Rendering::manager().monitors_geometry_.clear();
// list monitors with GLFW // list monitors with GLFW
int count_monitors = 0; int count_monitors = 0;
@@ -198,10 +206,9 @@ void Rendering::MonitorConnect(GLFWmonitor* monitor, int event)
const GLFWvidmode *vm = glfwGetVideoMode(monitors[i]); const GLFWvidmode *vm = glfwGetVideoMode(monitors[i]);
std::string n = glfwGetMonitorName(monitors[i]); std::string n = glfwGetMonitorName(monitors[i]);
// add // add
Rendering::manager().monitors_[n] = glm::ivec4(x, y, vm->width, vm->height); Rendering::manager().monitors_geometry_[n] = glm::ivec4(x, y, vm->width, vm->height);
} }
// TODO : find appropriate
// inform Displays View that monitors changed // inform Displays View that monitors changed
Mixer::manager().view(View::DISPLAYS)->recenter(); Mixer::manager().view(View::DISPLAYS)->recenter();
@@ -386,7 +393,7 @@ bool Rendering::init()
output_.init(1, main_.window()); output_.init(1, main_.window());
output_.setIcon("images/vimix_256x256.png"); output_.setIcon("images/vimix_256x256.png");
// special callbacks for user input in output window // special callbacks for user input in output window
glfwSetMouseButtonCallback( output_.window(), WindowToggleFullscreen); glfwSetMouseButtonCallback( output_.window(), OutputWindowEvent);
// //
// Monitors configuration // Monitors configuration
@@ -431,8 +438,8 @@ void Rendering::draw()
glfwPollEvents(); glfwPollEvents();
// change windows fullscreen mode if requested // change windows fullscreen mode if requested
main_.toggleFullscreen_(); main_.changeFullscreen_();
output_.toggleFullscreen_(); output_.changeFullscreen_();
// change main window title if requested // change main window title if requested
if (!main_new_title_.empty()) { if (!main_new_title_.empty()) {
@@ -667,7 +674,7 @@ WindowSurface::WindowSurface(Shader *s) : Primitive(s)
RenderingWindow::RenderingWindow() : window_(nullptr), master_(nullptr), RenderingWindow::RenderingWindow() : window_(nullptr), master_(nullptr),
index_(-1), dpi_scale_(1.f), textureid_(0), fbo_(0), surface_(nullptr), request_toggle_fullscreen_(false) index_(-1), dpi_scale_(1.f), textureid_(0), fbo_(0), surface_(nullptr), request_change_fullscreen_(false)
{ {
} }
@@ -703,19 +710,15 @@ void RenderingWindow::setIcon(const std::string &resource)
} }
} }
bool RenderingWindow::isFullscreen ()
{
// return (glfwGetWindowMonitor(window_) != nullptr);
return Settings::application.windows[index_].fullscreen;
}
GLFWmonitor *RenderingWindow::monitor() GLFWmonitor *RenderingWindow::monitor()
{ {
// pick at the coordinates given or at pos of window // get monitor at the center of the window
int x = 1, y = 1; int x = 0, y = 0, w = 2, h = 2;
if (window_ != nullptr) if (window_ != nullptr) {
glfwGetWindowSize(window_, &w, &h);
glfwGetWindowPos(window_, &x, &y); glfwGetWindowPos(window_, &x, &y);
return Rendering::manager().monitorAt(x, y); }
return Rendering::manager().monitorAt(x + w/2, y + h/2);
} }
void RenderingWindow::setFullscreen_(GLFWmonitor *mo) void RenderingWindow::setFullscreen_(GLFWmonitor *mo)
@@ -723,9 +726,6 @@ void RenderingWindow::setFullscreen_(GLFWmonitor *mo)
if (window_ == nullptr) if (window_ == nullptr)
return; return;
// done request
request_toggle_fullscreen_ = false;
// disable fullscreen mode // disable fullscreen mode
if (mo == nullptr) { if (mo == nullptr) {
// store fullscreen mode // store fullscreen mode
@@ -746,8 +746,9 @@ void RenderingWindow::setFullscreen_(GLFWmonitor *mo)
// set to fullscreen mode // set to fullscreen mode
const GLFWvidmode * mode = glfwGetVideoMode(mo); const GLFWvidmode * mode = glfwGetVideoMode(mo);
glfwSetInputMode( window_, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
glfwSetWindowMonitor( window_, mo, 0, 0, mode->width, mode->height, mode->refreshRate); glfwSetWindowMonitor( window_, mo, 0, 0, mode->width, mode->height, mode->refreshRate);
glfwSetInputMode( window_, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
} }
// Enable vsync on output window only (i.e. not 0 if has a master) // Enable vsync on output window only (i.e. not 0 if has a master)
@@ -756,36 +757,63 @@ void RenderingWindow::setFullscreen_(GLFWmonitor *mo)
} }
void RenderingWindow::exitFullscreen() bool RenderingWindow::isFullscreen ()
{ {
if (isFullscreen()) { // return (glfwGetWindowMonitor(window_) != nullptr);
// exit fullscreen return Settings::application.windows[index_].fullscreen;
request_toggle_fullscreen_ = true;
}
} }
void RenderingWindow::toggleFullscreen() void RenderingWindow::exitFullscreen ()
{ {
request_toggle_fullscreen_ = true; // exit fullscreen
request_change_fullscreen_ = isFullscreen();
} }
void RenderingWindow::toggleFullscreen_() void RenderingWindow::toggleFullscreen ()
{ {
if (request_toggle_fullscreen_) { request_change_fullscreen_ = true;
}
void RenderingWindow::setFullscreen (std::string monitorname)
{
Settings::application.windows[index_].monitor = monitorname;
request_change_fullscreen_ = true;
}
void RenderingWindow::changeFullscreen_()
{
// change upon request
if (request_change_fullscreen_) {
// done request
request_change_fullscreen_ = false;
GLFWmonitor *mo = Rendering::manager().monitorNamed( Settings::application.windows[index_].monitor );
// if in fullscreen mode // if in fullscreen mode
if (glfwGetWindowMonitor(window_) != nullptr) { if (isFullscreen ()) {
// exit fullscreen
setFullscreen_(nullptr); // changing fullscreen monitor
if ( glfwGetWindowMonitor(window_) != mo)
setFullscreen_(mo);
else
// exit fullscreen
setFullscreen_(nullptr);
} }
// not in fullscreen mode // not in fullscreen mode
else { else {
// enter fullscreen in monitor where the window is // enter fullscreen
setFullscreen_(monitor()); setFullscreen_(mo);
} }
} }
} }
void RenderingWindow::setCoordinates(glm::ivec4 rect)
{
glfwSetWindowPos( window_, rect.x, rect.y);
glfwSetWindowSize( window_, rect.p, rect.q);
}
int RenderingWindow::width() int RenderingWindow::width()
{ {
return window_attributes_.viewport.x; return window_attributes_.viewport.x;
@@ -886,6 +914,11 @@ bool RenderingWindow::init(int index, GLFWwindow *share)
// if not main window // if not main window
if ( master_ != NULL ) { if ( master_ != NULL ) {
// special window type
glfwSetWindowAttrib( window_, GLFW_DECORATED, GLFW_FALSE);
glfwSetWindowAttrib( window_, GLFW_RESIZABLE, GLFW_FALSE);
// Enable vsync on output window // Enable vsync on output window
glfwSwapInterval(Settings::application.render.vsync); glfwSwapInterval(Settings::application.render.vsync);
// no need for multisampling // no need for multisampling
@@ -983,19 +1016,28 @@ void RenderingWindow::draw(FrameBuffer *fb)
// calculate scaling factor of frame buffer inside window // calculate scaling factor of frame buffer inside window
int rx, ry, rw, rh; int rx, ry, rw, rh;
float renderingAspectRatio = fb->aspectRatio(); float renderingAspectRatio = fb->aspectRatio();
if (aspectRatio() < renderingAspectRatio) {
int nh = (int)( float(window_attributes_.viewport.x) / renderingAspectRatio); if (Settings::application.windows[index_].scaled) {
rx = 0; rx = 0;
ry = (window_attributes_.viewport.y - nh) / 2;
rw = window_attributes_.viewport.x;
rh = (window_attributes_.viewport.y + nh) / 2;
} else {
int nw = (int)( float(window_attributes_.viewport.y) * renderingAspectRatio );
rx = (window_attributes_.viewport.x - nw) / 2;
ry = 0; ry = 0;
rw = (window_attributes_.viewport.x + nw) / 2; rw = window_attributes_.viewport.x;
rh = window_attributes_.viewport.y; rh = window_attributes_.viewport.y;
} }
else {
if (aspectRatio() < renderingAspectRatio) {
int nh = (int)( float(window_attributes_.viewport.x) / renderingAspectRatio);
rx = 0;
ry = (window_attributes_.viewport.y - nh) / 2;
rw = window_attributes_.viewport.x;
rh = (window_attributes_.viewport.y + nh) / 2;
} else {
int nw = (int)( float(window_attributes_.viewport.y) * renderingAspectRatio );
rx = (window_attributes_.viewport.x - nw) / 2;
ry = 0;
rw = (window_attributes_.viewport.x + nw) / 2;
rh = window_attributes_.viewport.y;
}
}
// select fbo texture read target // select fbo texture read target
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_); glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
@@ -1020,11 +1062,14 @@ void RenderingWindow::draw(FrameBuffer *fb)
// calculate scaling factor of frame buffer inside window // calculate scaling factor of frame buffer inside window
float windowAspectRatio = aspectRatio(); float windowAspectRatio = aspectRatio();
float renderingAspectRatio = fb->aspectRatio(); float renderingAspectRatio = fb->aspectRatio();
glm::vec3 scale; glm::vec3 scale = glm::vec3(1.f, 1.f, 1.f);
if (windowAspectRatio < renderingAspectRatio)
scale = glm::vec3(1.f, windowAspectRatio / renderingAspectRatio, 1.f); if (!Settings::application.windows[index_].scaled) {
else if (windowAspectRatio < renderingAspectRatio)
scale = glm::vec3(renderingAspectRatio / windowAspectRatio, 1.f, 1.f); scale = glm::vec3(1.f, windowAspectRatio / renderingAspectRatio, 1.f);
else
scale = glm::vec3(renderingAspectRatio / windowAspectRatio, 1.f, 1.f);
}
// make sure previous shader in another glcontext is disabled // make sure previous shader in another glcontext is disabled
ShadingProgram::enduse(); ShadingProgram::enduse();

View File

@@ -38,8 +38,8 @@ class RenderingWindow
uint fbo_; uint fbo_;
class WindowSurface *surface_; class WindowSurface *surface_;
bool request_toggle_fullscreen_; bool request_change_fullscreen_;
void toggleFullscreen_ (); void changeFullscreen_ ();
void setFullscreen_(GLFWmonitor *mo); void setFullscreen_(GLFWmonitor *mo);
public: public:
@@ -65,9 +65,13 @@ public:
// fullscreen // fullscreen
bool isFullscreen (); bool isFullscreen ();
void exitFullscreen(); void exitFullscreen ();
void setFullscreen (std::string monitorname);
void toggleFullscreen (); void toggleFullscreen ();
// set geometry
void setCoordinates(glm::ivec4 rect);
// get width of rendering area // get width of rendering area
int width(); int width();
// get height of rendering area // get height of rendering area
@@ -143,8 +147,7 @@ public:
glm::vec2 project(glm::vec3 scene_coordinate, glm::mat4 modelview = glm::mat4(1.f), bool to_framebuffer = true); glm::vec2 project(glm::vec3 scene_coordinate, glm::mat4 modelview = glm::mat4(1.f), bool to_framebuffer = true);
// get hold on the monitors // get hold on the monitors
void monitorsUpdate(); inline std::map<std::string, glm::ivec4> monitors() { return monitors_geometry_; }
inline std::map<std::string, glm::ivec4> monitors() { return monitors_; }
// get which monitor contains this point // get which monitor contains this point
GLFWmonitor *monitorAt(int x, int y); GLFWmonitor *monitorAt(int x, int y);
// get which monitor has this name // get which monitor has this name
@@ -174,7 +177,7 @@ private:
RenderingWindow output_; RenderingWindow output_;
// monitors // monitors
std::map<std::string, glm::ivec4> monitors_; std::map<std::string, glm::ivec4> monitors_geometry_;
static void MonitorConnect(GLFWmonitor* monitor, int event); static void MonitorConnect(GLFWmonitor* monitor, int event);
// file drop callback // file drop callback

View File

@@ -105,8 +105,9 @@ void Settings::Save(uint64_t runtime)
window->SetAttribute("x", w.x); window->SetAttribute("x", w.x);
window->SetAttribute("y", w.y); window->SetAttribute("y", w.y);
window->SetAttribute("w", w.w); window->SetAttribute("w", w.w);
window->SetAttribute("h", w.h); window->SetAttribute("h", w.h);
window->SetAttribute("f", w.fullscreen); window->SetAttribute("f", w.fullscreen);
window->SetAttribute("s", w.scaled);
window->SetAttribute("m", w.monitor.c_str()); window->SetAttribute("m", w.monitor.c_str());
windowsNode->InsertEndChild(window); windowsNode->InsertEndChild(window);
} }
@@ -502,6 +503,7 @@ void Settings::Load()
windowNode->QueryIntAttribute("w", &w.w); windowNode->QueryIntAttribute("w", &w.w);
windowNode->QueryIntAttribute("h", &w.h); windowNode->QueryIntAttribute("h", &w.h);
windowNode->QueryBoolAttribute("f", &w.fullscreen); windowNode->QueryBoolAttribute("f", &w.fullscreen);
windowNode->QueryBoolAttribute("s", &w.scaled);
const char *text = windowNode->Attribute("m"); const char *text = windowNode->Attribute("m");
if (text) if (text)
w.monitor = std::string(text); w.monitor = std::string(text);

View File

@@ -60,9 +60,10 @@ struct WindowConfig
std::string name; std::string name;
int x,y,w,h; int x,y,w,h;
bool fullscreen; bool fullscreen;
bool scaled;
std::string monitor; std::string monitor;
WindowConfig() : name(""), x(15), y(15), w(1280), h(720), fullscreen(false), monitor("") { } WindowConfig() : name(""), x(15), y(15), w(1280), h(720), fullscreen(false), scaled(false), monitor("") { }
}; };
@@ -336,6 +337,7 @@ struct Application
windows[0].w = 1600; windows[0].w = 1600;
windows[0].h = 900; windows[0].h = 900;
windows[1].name = "Output " APP_TITLE; windows[1].name = "Output " APP_TITLE;
windows[2].name = "Fullscreen " APP_TITLE;
} }
}; };

View File

@@ -871,7 +871,7 @@ void TextureView::draw()
} }
if (ImGui::BeginPopup("AppearanceSourceContextMenu")) { if (ImGui::BeginPopup("AppearanceSourceContextMenu")) {
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(COLOR_APPEARANCE_SOURCE, 1.f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(COLOR_APPEARANCE_SOURCE, 1.f));
ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.36f, 0.36f, 0.36f, 0.44f)); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(COLOR_MENU_HOVERED, 0.5f));
Source *s = Mixer::manager().currentSource(); Source *s = Mixer::manager().currentSource();
if (s != nullptr) { if (s != nullptr) {

View File

@@ -109,6 +109,7 @@
#define COLOR_SLIDER_CIRCLE 0.11f, 0.11f, 0.11f #define COLOR_SLIDER_CIRCLE 0.11f, 0.11f, 0.11f
#define COLOR_STASH_CIRCLE 0.06f, 0.06f, 0.06f #define COLOR_STASH_CIRCLE 0.06f, 0.06f, 0.06f
#define COLOR_MONITOR 0.2f, 0.85f, 0.85f #define COLOR_MONITOR 0.2f, 0.85f, 0.85f
#define COLOR_MENU_HOVERED 0.3f, 0.3f, 0.3f
#define OSC_PORT_RECV_DEFAULT 7000 #define OSC_PORT_RECV_DEFAULT 7000
#define OSC_PORT_SEND_DEFAULT 7001 #define OSC_PORT_SEND_DEFAULT 7001