static bool AddState(JSON &json, CGstateassignment sa) { const CGstate state = cgGetStateAssignmentState(sa); const char * const stateName = cgGetStateName(state); if (false == IsValidState(stateName)) { ErrorMessage("Invalid state for OpenGL ES 2.0 %s", stateName); return false; } const CGtype type = cgGetStateType(state); int nValues; switch (type) { case CG_PROGRAM_TYPE: return true; case CG_FLOAT: case CG_FLOAT1: { const float * const fvalues = cgGetFloatStateAssignmentValues(sa, &nValues); json.AddValue(stateName, fvalues[0]); } break; case CG_FLOAT2: case CG_FLOAT3: case CG_FLOAT4: { const float * const fvalues = cgGetFloatStateAssignmentValues(sa, &nValues); json.AddArray(stateName, true); json.BeginData(true); for (int n = 0; n < nValues; ++n) { json.AddData(fvalues[n]); } json.EndData(); json.CloseArray(true); } break; case CG_INT: case CG_INT1: { const int * const ivalues = cgGetIntStateAssignmentValues(sa, &nValues); json.AddValue(stateName, ivalues[0]); } break; case CG_INT2: case CG_INT3: case CG_INT4: { const int * const ivalues = cgGetIntStateAssignmentValues(sa, &nValues); json.AddArray(stateName, true); json.BeginData(true); for (int n = 0; n < nValues; ++n) { json.AddData(ivalues[n]); } json.EndData(); json.CloseArray(true); } break; case CG_BOOL: case CG_BOOL1: { const CGbool * const bvalues = cgGetBoolStateAssignmentValues(sa, &nValues); json.AddBoolean(stateName, (bvalues[0] ? true : false)); } break; case CG_BOOL2: case CG_BOOL3: case CG_BOOL4: { const CGbool * const bvalues = cgGetBoolStateAssignmentValues(sa, &nValues); json.AddArray(stateName, true); json.BeginData(true); for (int n = 0; n < nValues; ++n) { json.AddData(bvalues[n]); } json.EndData(); json.CloseArray(true); } break; case CG_STRING: json.AddString(stateName, cgGetStringStateAssignmentValue(sa)); break; default: ErrorMessage("UNEXPECTED State Assignment Type: %s 0x%x (%d)\n", cgGetTypeString(type), type, type); return false; } return true; }