@@ -1459,72 +1459,157 @@ void Visualizer::LEDUpdateThreadFunction()
1459
1459
{
1460
1460
for (int c = 0 ; c < rgb_controllers.size (); c++)
1461
1461
{
1462
+ ControllerIndexType * controller_index_map = NULL ;
1463
+ bool index_map_found = false ;
1464
+
1465
+ // Find matching controller index map
1466
+ if ((c < ZoneIndex.size ()) && (ZoneIndex[c].controller_ptr == rgb_controllers[c]))
1467
+ {
1468
+ // The controller index map has been found
1469
+ controller_index_map = &ZoneIndex[c];
1470
+ index_map_found = true ;
1471
+ }
1472
+ else
1473
+ {
1474
+ // Search all the controller index maps
1475
+ for (int i = 0 ; i < ZoneIndex.size (); i++)
1476
+ {
1477
+ if (ZoneIndex[i].controller_ptr == rgb_controllers[c])
1478
+ {
1479
+ // The controller index map has been found
1480
+ controller_index_map = &ZoneIndex[i];
1481
+ index_map_found = true ;
1482
+ }
1483
+ }
1484
+ }
1485
+
1486
+ // If the index map doesn't exist for this controller, create it
1487
+ if (index_map_found == false )
1488
+ {
1489
+ ControllerIndexType * new_index_map = new ControllerIndexType ();
1490
+ new_index_map->controller_ptr = rgb_controllers[c];
1491
+
1492
+ ZoneIndex.insert (ZoneIndex.begin () + c, *new_index_map);
1493
+
1494
+ controller_index_map = &ZoneIndex[c];
1495
+ }
1496
+
1462
1497
for (int z = 0 ; z < rgb_controllers[c]->zones .size (); z++)
1463
1498
{
1464
- switch (rgb_controllers[c]->zones [z].type )
1499
+ int x_count = rgb_controllers[c]->zones [z].leds_count ;
1500
+ int y_count = 0 ;
1501
+ zone_type type = rgb_controllers[c]->zones [z].type ;
1502
+ ZoneIndexType * zone_index_map = NULL ;
1503
+ index_map_found = false ;
1504
+
1505
+ // If matrix type and matrix mapping is valid, get X and Y count
1506
+ if (type == ZONE_TYPE_MATRIX)
1465
1507
{
1466
- // OpenRGB doesn't yet have matrix mapping after reworking controller layout
1467
- // For now, just treat matrix devices as single zones
1468
- case ZONE_TYPE_MATRIX:
1469
1508
if (rgb_controllers[c]->zones [z].matrix_map != NULL )
1470
1509
{
1471
- int x_count = rgb_controllers[c]->zones [z].matrix_map ->width ;
1472
- int y_count = rgb_controllers[c]->zones [z].matrix_map ->height ;
1473
- int * ZoneXIndex = new int [x_count];
1474
- int * ZoneYIndex = new int [y_count];
1510
+ x_count = rgb_controllers[c]->zones [z].matrix_map ->width ;
1511
+ y_count = rgb_controllers[c]->zones [z].matrix_map ->height ;
1512
+ }
1513
+ else
1514
+ {
1515
+ type = ZONE_TYPE_SINGLE;
1516
+ }
1517
+ }
1475
1518
1476
- SetupMatrixGrid (x_count, y_count, ZoneXIndex, ZoneYIndex);
1519
+ // Search all the zone index maps
1520
+ for (int i = 0 ; i < controller_index_map->zones .size (); i++)
1521
+ {
1522
+ zone_index_map = &controller_index_map->zones [i];
1477
1523
1478
- for (int y = 0 ; y < y_count; y++)
1479
- {
1480
- for (int x = 0 ; x < x_count; x++)
1481
- {
1482
- unsigned int map_idx = (y * rgb_controllers[c]->zones [z].matrix_map ->width ) + x;
1483
- unsigned int color_idx = rgb_controllers[c]->zones [z].matrix_map ->map [map_idx];
1484
- if ( color_idx != 0xFFFFFFFF )
1485
- {
1486
- rgb_controllers[c]->zones [z].colors [color_idx] = pixels_out->pixels [ZoneYIndex[y]][ZoneXIndex[x]];
1487
- }
1488
- }
1489
- }
1524
+ if ((zone_index_map->x_count == x_count) && (zone_index_map->y_count == y_count))
1525
+ {
1526
+ index_map_found = true ;
1527
+ break ;
1528
+ }
1529
+ }
1490
1530
1491
- delete[] ZoneXIndex;
1492
- delete[] ZoneYIndex;
1531
+ // If the index map doesn't exist for this zone, create it
1532
+ if (index_map_found == false )
1533
+ {
1534
+ ZoneIndexType * new_index_map = new ZoneIndexType ();
1535
+ new_index_map->x_count = x_count;
1536
+ new_index_map->y_count = y_count;
1537
+
1538
+ if (type == ZONE_TYPE_MATRIX)
1539
+ {
1540
+ new_index_map->x_index = new int [x_count];
1541
+ new_index_map->y_index = new int [y_count];
1542
+
1543
+ SetupMatrixGrid (x_count, y_count, new_index_map->x_index , new_index_map->y_index );
1493
1544
}
1494
- else
1545
+ else if (type == ZONE_TYPE_LINEAR)
1546
+ {
1547
+ new_index_map->x_index = new int [x_count];
1548
+
1549
+ SetupLinearGrid (x_count, new_index_map->x_index );
1550
+ }
1551
+
1552
+ controller_index_map->zones .push_back (*new_index_map);
1553
+
1554
+ zone_index_map = &controller_index_map->zones [controller_index_map->zones .size () - 1 ];
1555
+ }
1556
+
1557
+ switch (rgb_controllers[c]->zones [z].type )
1558
+ {
1559
+ case ZONE_TYPE_MATRIX:
1560
+ for (int y = 0 ; y < y_count; y++)
1495
1561
{
1496
- for (int r = 0 ; r < rgb_controllers[c]-> zones [z]. leds_count ; r ++)
1562
+ for (int x = 0 ; x < x_count; x ++)
1497
1563
{
1498
- rgb_controllers[c]->zones [z].colors [r] = pixels_out->pixels [ROW_IDX_SINGLE_COLOR][0 ];
1564
+ unsigned int map_idx = (y * x_count) + x;
1565
+ unsigned int color_idx = rgb_controllers[c]->zones [z].matrix_map ->map [map_idx];
1566
+ if ( color_idx != 0xFFFFFFFF )
1567
+ {
1568
+ rgb_controllers[c]->zones [z].colors [color_idx] = pixels_out->pixels [zone_index_map->y_index [y]][zone_index_map->x_index [x]];
1569
+ }
1499
1570
}
1500
1571
}
1501
1572
break ;
1502
1573
1503
1574
case ZONE_TYPE_SINGLE:
1504
- for (int r = 0 ; r < rgb_controllers[c]-> zones [z]. leds_count ; r++)
1575
+ for (int r = 0 ; r < x_count ; r++)
1505
1576
{
1506
1577
rgb_controllers[c]->zones [z].colors [r] = pixels_out->pixels [ROW_IDX_SINGLE_COLOR][0 ];
1507
1578
}
1508
1579
break ;
1509
1580
1510
1581
case ZONE_TYPE_LINEAR:
1511
- unsigned int num_leds = rgb_controllers[c]->zones [z].leds_count ;
1512
- int * ZoneXIndex = new int [num_leds];
1513
-
1514
- SetupLinearGrid (num_leds, ZoneXIndex);
1515
-
1516
- for (int x = 0 ; x < rgb_controllers[c]->zones [z].leds_count ; x++)
1582
+ for (int x = 0 ; x < x_count; x++)
1517
1583
{
1518
- rgb_controllers[c]->zones [z].colors [x] = pixels_out->pixels [ROW_IDX_BAR_GRAPH][ZoneXIndex [x]];
1584
+ rgb_controllers[c]->zones [z].colors [x] = pixels_out->pixels [ROW_IDX_BAR_GRAPH][zone_index_map-> x_index [x]];
1519
1585
}
1520
-
1521
- delete[] ZoneXIndex;
1522
1586
break ;
1523
1587
}
1524
1588
}
1525
1589
rgb_controllers[c]->DeviceUpdateLEDs ();
1526
1590
}
1527
1591
1592
+ if (ZoneIndex.size () > rgb_controllers.size ())
1593
+ {
1594
+ for (int z = 0 ; z < ZoneIndex.size (); z++)
1595
+ {
1596
+ bool controller_found = false ;
1597
+
1598
+ for (int r = 0 ; r < rgb_controllers.size (); r++)
1599
+ {
1600
+ if (ZoneIndex[z].controller_ptr == rgb_controllers[r])
1601
+ {
1602
+ controller_found = true ;
1603
+ }
1604
+ }
1605
+
1606
+ if (controller_found == false )
1607
+ {
1608
+ ZoneIndex.erase (ZoneIndex.begin () + z);
1609
+ z--;
1610
+ }
1611
+ }
1612
+ }
1528
1613
Sleep (delay);
1529
1614
}
1530
1615
}
0 commit comments