Skip to content

Commit 71486ec

Browse files
Merge pull request #135 from mvrdevelopment/virtual-resolution-v2.2
Fixed converting from higher to lower resolution
2 parents fb33804 + 7037599 commit 71486ec

4 files changed

Lines changed: 37 additions & 24 deletions

File tree

.vscode/launch.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
"version": "0.2.0",
66
"configurations": [
77
{
8-
CreateDmxChannelSet
98
"preLaunchTask": "build"
109
},
1110
{

src/GDTFManager.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5589,16 +5589,12 @@ const TGdtfDmxLogicalChannelArray GdtfDmxChannel::GetLogicalChannelArray()
55895589

55905590
EGdtfChannelBitResolution SceneData::GdtfDmxChannel::GetChannelBitResolution()
55915591
{
5592-
// 0 is false, everything else is true
5593-
if ((!fCoarse) && !fFine && !fUltra && !fUber) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32; }
5594-
else if (( fCoarse) && !fFine && !fUltra && !fUber) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8; }
5595-
else if (( fCoarse) &&( fFine) && !fUltra && !fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; }
5596-
else if (( fCoarse) &&( fFine) && ( fUltra) && !fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_24; }
5597-
else if (( fCoarse) &&( fFine) && ( fUltra) && ( fUber)) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32; }
5598-
5599-
// Other states are invalid. This line should never be reached.
5600-
DSTOP((kEveryone, "Invalid state in GetChannelBitResolution()"));
5601-
return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8;
5592+
if (!fCoarse) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; }
5593+
else if (!fFine) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8; }
5594+
else if (!fUltra) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; }
5595+
else if (!fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_24; }
5596+
5597+
return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32;
56025598
}
56035599

56045600
DmxValue SceneData::GdtfDmxChannel::GetChannelMaxDmx()

src/XmlFileHelper.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//-----------------------------------------------------------------------------
44

55
#include "Prefix/StdAfx.h"
6+
#include <cmath>
67
using namespace VectorworksMVR::VWFC;
78

89
#include "SceneDataExchange.h"
@@ -745,7 +746,23 @@ bool SceneData::GdtfConverter::ConvertDMXValue(const TXString& strValue, const I
745746

746747
double percentage = (dmxValueRaw / maxResolution);
747748

748-
intValue = percentage * maxChannelUnit;
749+
double result = percentage * maxChannelUnit;
750+
751+
// Clamp to avoid floating-point precision errors when converting from higher to lower resolution
752+
if (result > maxChannelUnit) {
753+
intValue = maxChannelUnit;
754+
} else {
755+
// Preserve ordering: ensure non-zero inputs stay non-zero
756+
if (dmxValueRaw > 0 && result < 1.0) {
757+
intValue = 1;
758+
} else {
759+
intValue = static_cast<DmxValue>(result + 0.5);
760+
}
761+
762+
if (intValue > maxChannelUnit) {
763+
intValue = maxChannelUnit;
764+
}
765+
}
749766

750767
}
751768
else
@@ -757,7 +774,7 @@ bool SceneData::GdtfConverter::ConvertDMXValue(const TXString& strValue, const I
757774

758775

759776

760-
if ( GetChannelMaxDmx(chanlReso) < intValue)
777+
if ( intValue > GetChannelMaxDmx(chanlReso))
761778
{
762779
GdtfParsingError error (GdtfDefines::EGdtfParsingError::eValueError_DmxValueHasWrongValue, node);
763780
SceneData::GdtfFixture::AddError(error);

unittest/GdtfDmxUnittest.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,14 @@ void GdtfDmxUnittest::WriteFile()
303303
virtualFunction->SetAttribute(attribute5);
304304
__checkVCOM(virtualFunction->SetDefaultValue(50000));
305305

306-
IGdtfDmxChannelSetPtr virtualChannelSet1;
307-
virtualFunction->CreateDmxChannelSet("My Name1", 0, 0, &virtualChannelSet1);
308-
309-
IGdtfDmxChannelSetPtr virtualChannelSet3;
310-
virtualFunction->CreateDmxChannelSet("My Name3", 4294967295, 4294967295, &virtualChannelSet3);
306+
IGdtfDmxChannelSetPtr virtualChannelSet1;
307+
virtualFunction->CreateDmxChannelSet("My Name1", 0, 0, &virtualChannelSet1);
311308

309+
IGdtfDmxChannelSetPtr virtualChannelSet2;
310+
virtualFunction->CreateDmxChannelSet("", 1, 65534, &virtualChannelSet2);
312311

312+
IGdtfDmxChannelSetPtr virtualChannelSet3;
313+
virtualFunction->CreateDmxChannelSet("My Name3", 65535, 65535, &virtualChannelSet3);
313314
__checkVCOM(gdtfWrite->Close());
314315
}
315316
}
@@ -581,13 +582,13 @@ void GdtfDmxUnittest::ReadFile()
581582
this->CheckChannelSet(virtualChannelSet1, "My Name1", 0, 0);
582583

583584

584-
IGdtfDmxChannelSetPtr virtualChannelSet2;
585-
__checkVCOM(virtualFunction->GetDmxChannelSetAt(1, &virtualChannelSet2));
586-
this->CheckChannelSet(virtualChannelSet2, "", 1, 4294967294);
585+
IGdtfDmxChannelSetPtr virtualChannelSet2;
586+
__checkVCOM(virtualFunction->GetDmxChannelSetAt(1, &virtualChannelSet2));
587+
this->CheckChannelSet(virtualChannelSet2, "", 1, 65534);
587588

588-
IGdtfDmxChannelSetPtr virtualChannelSet3;
589-
__checkVCOM(virtualFunction->GetDmxChannelSetAt(2, &virtualChannelSet3));
590-
this->CheckChannelSet(virtualChannelSet3, "My Name3", 4294967295, 4294967295);
589+
IGdtfDmxChannelSetPtr virtualChannelSet3;
590+
__checkVCOM(virtualFunction->GetDmxChannelSetAt(2, &virtualChannelSet3));
591+
this->CheckChannelSet(virtualChannelSet3, "My Name3", 65535, 65535);
591592
}
592593

593594
PrintParsingErrorList(gdtfRead);

0 commit comments

Comments
 (0)