static void AddParameter(JSON &json, CGparameter param) { const char * const parameterName = cgGetParameterName(param); if (sVerbose) { puts(parameterName); } json.AddObject(parameterName); const CGtype type = cgGetParameterType(param); const CGtype baseType = cgGetParameterBaseType(param); int numRows = cgGetParameterRows(param); const int numColumns = cgGetParameterColumns(param); if (CG_ARRAY == type) { const int totalArraySize = cgGetArrayTotalSize(param); numRows *= totalArraySize; } json.AddString("type", cgGetTypeString(baseType)); if (1 < numRows) { json.AddValue("rows", numRows); } if (1 < numColumns) { json.AddValue("columns", numColumns); } const int maxNumElements = (numColumns * numRows); int n; if (CG_FLOAT == baseType) { float * const values = (float *)malloc(maxNumElements * sizeof(float)); const int numValues = cgGetParameterValuefr(param, maxNumElements, values); if (numValues) { for (n = 0; n < numValues; n++) { if (values[n] != 0.0f) { break; } } if (n < numValues) { json.AddArray("values", true); json.BeginData(true); for (n = 0; n < numValues; n++) { json.AddData(values[n]); } json.EndData(); json.CloseArray(true); } } free(values); } else if (CG_INT == baseType) { int * const values = (int *)malloc(maxNumElements * sizeof(int)); const int numValues = cgGetParameterValueir(param, maxNumElements, values); if (numValues) { for (n = 0; n < numValues; n++) { if (values[n]) { break; } } if (n < numValues) { json.AddArray("values", true); json.BeginData(true); for (n = 0; n < numValues; n++) { json.AddData(values[n]); } json.EndData(); json.CloseArray(true); } } free(values); } else if (CG_BOOL == baseType) { int * const values = (int *)malloc(maxNumElements * sizeof(int)); const int numValues = cgGetParameterValueir(param, maxNumElements, values); if (numValues) { for (n = 0; n < numValues; n++) { if (values[n]) { break; } } if (n < numValues) { json.AddArray("values", true); json.BeginData(true); for (n = 0; n < numValues; n++) { json.AddData(values[n]); } json.EndData(); json.CloseArray(true); } } free(values); } json.CloseObject(); // parameter }
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; }