bool HMDState::setFloatArray(const char* propertyName, float values[], unsigned arraySize) { if (!arraySize) { return false; } if (OVR_strcmp(propertyName, "DistortionClearColor") == 0) { CopyFloatArrayWithLimit(RenderState.ClearColor, 4, values, arraySize); return true; } if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetNumberValues, propertyName)) { double* da = new double[arraySize]; for (int i = 0; i < (int)arraySize; ++i) { da[i] = values[i]; } bool result = NetClient::GetInstance()->SetNumberValues(GetNetId(), propertyName, da, arraySize); delete[] da; return result; } return false; }
unsigned HMDState::getFloatArray(const char* propertyName, float values[], unsigned arraySize) { if (arraySize) { if (OVR_strcmp(propertyName, "ScreenSize") == 0) { float data[2] = { OurHMDInfo.ScreenSizeInMeters.w, OurHMDInfo.ScreenSizeInMeters.h }; return CopyFloatArrayWithLimit(values, arraySize, data, 2); } else if (OVR_strcmp(propertyName, "DistortionClearColor") == 0) { return CopyFloatArrayWithLimit(values, arraySize, RenderState.ClearColor, 4); } else if (OVR_strcmp(propertyName, "DK2Latency") == 0) { if (OurHMDInfo.HmdType != HmdType_DK2) { return 0; } union { struct X { float latencyRender, latencyTimewarp, latencyPostPresent; } x; float data[3]; } m; static_assert(sizeof(m.x)==sizeof(m.data), "sizeof(struct X) failure"); TimeManager.GetLatencyTimings(m.x.latencyRender, m.x.latencyTimewarp, m.x.latencyPostPresent); return CopyFloatArrayWithLimit(values, arraySize, m.data, 3); } else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValues, propertyName)) { // Convert floats to doubles double* da = new double[arraySize]; for (int i = 0; i < (int)arraySize; ++i) { da[i] = values[i]; } int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, da, (int)arraySize); for (int i = 0; i < count; ++i) { values[i] = (float)da[i]; } delete[] da; return count; } else if (pProfile) { // TBD: Not quite right. Should update profile interface, so that // we can return 0 in all conditions if property doesn't exist. return pProfile->GetFloatValues(propertyName, values, arraySize); } } return 0; }
unsigned HMDState::getFloatArray(const char* propertyName, float values[], unsigned arraySize) { if (arraySize) { if (OVR_strcmp(propertyName, "ScreenSize") == 0) { float data[2] = { OurHMDInfo.ScreenSizeInMeters.w, OurHMDInfo.ScreenSizeInMeters.h }; return CopyFloatArrayWithLimit(values, arraySize, data, 2); } else if (OVR_strcmp(propertyName, "DistortionClearColor") == 0) { return CopyFloatArrayWithLimit(values, arraySize, RenderState.ClearColor, 4); } else if (OVR_strcmp(propertyName, "DK2Latency") == 0) { if (OurHMDInfo.HmdType < HmdType_DK2) { return 0; } OutputLatencyTimings timings; ScreenLatencyTracker.GetLatencyTimings(timings); if (arraySize > 0) { switch (arraySize) { default: values[4] = (float)timings.ErrorTimewarp; // Fall-thru case 4: values[3] = (float)timings.ErrorRender; // Fall-thru case 3: values[2] = (float)timings.LatencyPostPresent; // Fall-thru case 2: values[1] = (float)timings.LatencyTimewarp; // Fall-thru case 1: values[0] = (float)timings.LatencyRender; } } return arraySize > 5 ? 5 : arraySize; } else if (OVR_strcmp(propertyName, "NeckModelVector3f") == 0) { // Query the service to grab the HNM. double hnm[3] = {}; int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, hnm, (int)arraySize); // If the service is unavailable or returns zero data, if (count < 3 || (hnm[0] == 0.0 && hnm[1] == 0.0 && hnm[2] == 0.0)) { // These are the default values used if the server does not return any data, due to not // being reachable or other errors. OVR_ASSERT(pProfile.GetPtr()); if (pProfile.GetPtr()) { Vector3f neckModel = GetNeckModelFromProfile(pProfile); hnm[0] = neckModel.x; hnm[1] = neckModel.y; hnm[2] = neckModel.z; } } for (unsigned i = 0; i < 3 && i < arraySize; ++i) { values[i] = (float)hnm[i]; } return arraySize > 3 ? 3 : arraySize; } else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValues, propertyName)) { // Convert floats to doubles double* da = new double[arraySize]; for (int i = 0; i < (int)arraySize; ++i) { da[i] = values[i]; } int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, da, (int)arraySize); for (int i = 0; i < count; ++i) { values[i] = (float)da[i]; } delete[] da; return count; } else if (pProfile) { // TBD: Not quite right. Should update profile interface, so that // we can return 0 in all conditions if property doesn't exist. return pProfile->GetFloatValues(propertyName, values, arraySize); } } return 0; }