/*-----------------------------------------------------------------------------------------* | <<< コマンド : col >>> *-----------------------------------------------------------------------------------------*/ static void ComCol(void) { if(meta->pTex == NULL) { sys.bError = true; sys_error("meta.pTex が NULL です。col の設定が Material { の外で行われています。"); return; } else { iMetaCount += PARAM_GET(&meta->pTex->afCol[1], &MetaText[iMetaCount]); // r iMetaCount += PARAM_GET(&meta->pTex->afCol[2], &MetaText[iMetaCount]); // g iMetaCount += PARAM_GET(&meta->pTex->afCol[3], &MetaText[iMetaCount]); // b iMetaCount += PARAM_GET(&meta->pTex->afCol[0], &MetaText[iMetaCount]); // a } iMetaCount++; }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : Material >>> | 入力 bUV = false : uv のチェックを行わない(法線マップを作成する際に使用) *-----------------------------------------------------------------------------------------*/ static void ComMaterial(BOOL bUV) { float a; iMetaCount += PARAM_GET(&a, &MetaText[iMetaCount]); meta->iMatCount = (int)a; // マテリアル総数 iMetaCount += 1; // "{" 分移動 // テクスチャーデータの書き込み位置を設定 meta->pTex = &meta->atex[meta->iMatID]; //--- 各パラメータ抽出 ------------------------------------------ while(MetaText[iMetaCount] != '}') { // 改行を見つけたら、次へすすむ char str[512]; if(MetaText[iMetaCount] == '\r' && MetaText[iMetaCount + 1] == '\n') { meta->iMatID++; // マテリアル読み込み終了なので、次へ進める // テクスチャーデータの書き込み位置を設定 meta->pTex = &meta->atex[meta->iMatID]; iMetaCount += 2; //--- マテリアル名を得る -------------------------------- int i = GET_STRING(str, &MetaText[iMetaCount]); if(meta_obj_name_func != NULL) // オブジェ名を外部へ渡す { void(*func)(int iNum, char *str); func = (void(*)(int iNum, char *str))meta_obj_name_func; (*func)(meta->iMatID, str); } iMetaCount += i; //------------------------------------------------------- } //--- コマンドチェック -------------------------------------- BOOL bRet = CommandCheck(bUV); //--- 半角・全角チェック ------------------------------------ if(!bRet) { //char str[512]; // ダブルクォーテーション中に コマンドが入っているのを防ぐため、こうする。 int i = GET_STRING(str, &MetaText[iMetaCount]); iMetaCount += i; if(i == 0) { if(ISKANJI(MetaText[iMetaCount])){ iMetaCount += 2;} // 全角 else { iMetaCount += 1;} // 半角 } } } iMetaCount++; meta->pTex = NULL; // テクスチャーデータの書き込み位置をクリアー }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : vertex >>> *-----------------------------------------------------------------------------------------*/ static void ComVertex(void) { float fAns; // 頂点数 iMetaCount += PARAM_GET(&fAns, &MetaText[iMetaCount]); iMetaCount += 3; // "{" と改行分を移動させる // ベース設定 meta->iPosBase = meta->iPosCount; //--- 頂点データを保存 ------------------------------------------ VEC3 *p = &meta->avecPos[meta->iPosCount]; for(int i = 0; i < (int)fAns; i++, p++) { iMetaCount += PARAM_GET(&p->x, &MetaText[iMetaCount]); iMetaCount += PARAM_GET(&p->y, &MetaText[iMetaCount]); iMetaCount += PARAM_GET(&p->z, &MetaText[iMetaCount]); p->z *= -1; *p *= SCALE; // スケールを合わせる iMetaCount += 2; // 改行を進める meta->iPosCount++; // 登録数増やす } }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : dif, amb, emi, spc, power >>> | 入力 iType = 0 : dif、1 : amb、2 : emi、3 : spc、4 : power *-----------------------------------------------------------------------------------------*/ static void ComDifAmbEmiSpcPower(int iType) { if(meta->pTex == NULL) { sys.bError = true; sys_error("meta.pTex が NULL です。色の設定が Material { の外で行われています。"); return; } else { // ポインタを使い無理やり値を代入 float *f = &meta->pTex->fDif; iMetaCount += PARAM_GET(&f[iType], &MetaText[iMetaCount]); iMetaCount++; // } を進める } }
int fixedwing_attitude_control_att_params_update() { PARAM_GET (fixedwing_attitude_control_att_parameter_handles.roll_p, &(fixedwing_attitude_control_att_parameters.roll_p)); PARAM_GET (fixedwing_attitude_control_att_parameter_handles.rollrate_lim, &(fixedwing_attitude_control_att_parameters.rollrate_lim)); PARAM_GET (fixedwing_attitude_control_att_parameter_handles.pitch_p, &(fixedwing_attitude_control_att_parameters.pitch_p)); PARAM_GET (fixedwing_attitude_control_att_parameter_handles.pitchrate_lim, &(fixedwing_attitude_control_att_parameters.pitchrate_lim)); PARAM_GET (fixedwing_attitude_control_att_parameter_handles.yawrate_lim, &(fixedwing_attitude_control_att_parameters.yawrate_lim)); PARAM_GET (fixedwing_attitude_control_att_parameter_handles.pitch_roll_compensation_p, &(fixedwing_attitude_control_att_parameters.pitch_roll_compensation_p)); return 0; }
int multirotor_rate_control_params_update() { PARAM_GET (multirotor_rate_control_parameter_handles.yawrate_p, &(multirotor_rate_control_parameters.yawrate_p)); PARAM_GET (multirotor_rate_control_parameter_handles.yawrate_i, &(multirotor_rate_control_parameters.yawrate_i)); PARAM_GET (multirotor_rate_control_parameter_handles.yawrate_d, &(multirotor_rate_control_parameters.yawrate_d)); //PARAM_GET (multirotor_rate_control_parameter_handles.yawrate_awu, &(multirotor_rate_control_parameters.yawrate_awu)); //PARAM_GET (multirotor_rate_control_parameter_handles.yawrate_lim, &(multirotor_rate_control_parameters.yawrate_lim)); PARAM_GET (multirotor_rate_control_parameter_handles.attrate_p, &(multirotor_rate_control_parameters.attrate_p)); PARAM_GET (multirotor_rate_control_parameter_handles.attrate_i, &(multirotor_rate_control_parameters.attrate_i)); PARAM_GET (multirotor_rate_control_parameter_handles.attrate_d, &(multirotor_rate_control_parameters.attrate_d)); //PARAM_GET (multirotor_rate_control_parameter_handles.attrate_awu, &(multirotor_rate_control_parameters.attrate_awu)); //PARAM_GET (multirotor_rate_control_parameter_handles.attrate_lim, &(multirotor_rate_control_parameters.attrate_lim)); return 0; }
int multirotor_attitude_control_params_update() { PARAM_GET (multirotor_attitude_control_parameter_handles.yaw_p, &(multirotor_attitude_control_parameters.yaw_p)); PARAM_GET (multirotor_attitude_control_parameter_handles.yaw_i, &(multirotor_attitude_control_parameters.yaw_i)); PARAM_GET (multirotor_attitude_control_parameter_handles.yaw_d, &(multirotor_attitude_control_parameters.yaw_d)); //PARAM_GET (multirotor_attitude_control_parameter_handles.yaw_awu, &(multirotor_attitude_control_parameters.yaw_awu)); //PARAM_GET (multirotor_attitude_control_parameter_handles.yaw_lim, &(multirotor_attitude_control_parameters.yaw_lim)); PARAM_GET (multirotor_attitude_control_parameter_handles.att_p, &(multirotor_attitude_control_parameters.att_p)); PARAM_GET (multirotor_attitude_control_parameter_handles.att_i, &(multirotor_attitude_control_parameters.att_i)); PARAM_GET (multirotor_attitude_control_parameter_handles.att_d, &(multirotor_attitude_control_parameters.att_d)); //PARAM_GET (multirotor_attitude_control_parameter_handles.att_awu, &(multirotor_attitude_control_parameters.att_awu)); //PARAM_GET (multirotor_attitude_control_parameter_handles.att_lim, &(multirotor_attitude_control_parameters.att_lim)); //PARAM_GET (multirotor_attitude_control_parameter_handles.att_xoff, &(multirotor_attitude_control_parameters.att_xoff)); //PARAM_GET (multirotor_attitude_control_parameter_handles.att_yoff, &(multirotor_attitude_control_parameters.att_yoff)); return 0; }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : facet >>> ※ スムージングの値 *-----------------------------------------------------------------------------------------*/ static void ComFacet(void) { iMetaCount += PARAM_GET(&meta->fSmooth, &MetaText[iMetaCount]); meta->fSmooth = R(meta->fSmooth); }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : mirror >>> *-----------------------------------------------------------------------------------------*/ static void ComMirror(void) { float fAns; iMetaCount += PARAM_GET(&fAns, &MetaText[iMetaCount]); meta->iMirrorType = (int)fAns; }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : face >>> | 入力 bUV = false : uv のチェックを行わない(法線マップを作成する際に使用) *-----------------------------------------------------------------------------------------*/ static void ComFace(BOOL bUV) { // faceチャンクから表面数を読み取り、その分だけ面を作成する // V(0 1 3 2) ← MvtSub[0], MvtSub[1], MvtSub[3], MvtSub[2] の頂点情報からなる面である // meta[メタセコファイル番号].face[登録表面数] float fFaceCount; // 面数 iMetaCount += PARAM_GET(&fFaceCount, &MetaText[iMetaCount]); iMetaCount += 3; // "{" と改行を移動させる float a, afIndex[4], afUV[8]; afIndex[3] = 0; //--- 表面データを保存 ------------------------------------------ for(int i = 0; i < (int)fFaceCount; i++) { //--- 頂点数 ------------------------------------------------ float fVertexCount; iMetaCount += PARAM_GET(&fVertexCount, &MetaText[iMetaCount]); //--- V() --------------------------------------------------- iMetaCount +=2; // V( を進める // 総面数を計算、四角形は2面となる int iPoly; if(fVertexCount == 4){ iPoly = 2;} else { iPoly = 1;} // 頂点番号を得る for(int j = 0; j < (int)fVertexCount; j++) { iMetaCount += PARAM_GET(&afIndex[j], &MetaText[iMetaCount]); afIndex[j] += meta->iPosBase; } iMetaCount++; // カッコ閉じる //--- M() --------------------------------------------------- SPACE_DEL(MetaText, &iMetaCount); uint uiMat = 0; if(MetaText[iMetaCount] == 'M') { iMetaCount += 2; // 材質情報 iMetaCount += PARAM_GET(&a, &MetaText[iMetaCount]); uiMat = (int)a; iMetaCount++; // カッコ閉じる } //--- UV() -------------------------------------------------- BOOL bUV = FALSE; SPACE_DEL(MetaText, &iMetaCount); if(MetaText[iMetaCount] == 'U' && MetaText[iMetaCount + 1] == 'V') { iMetaCount += 3; for(int j = 0; j < (int)fVertexCount * 2; j++) { iMetaCount += PARAM_GET(&afUV[j], &MetaText[iMetaCount]); //while(afUV[j] > 1){ afUV[j] -= 1;} // UV は 0 〜 1 に丸める } iMetaCount += 3; bUV = TRUE; } else { iMetaCount += 2; } //--- バッファ登録 ------------------------------------------ FaceSub(afIndex, afUV, uiMat, bUV, iPoly == 2, 0); if(meta->iMirrorType) { FaceSub(afIndex, afUV, uiMat, bUV, iPoly == 2, meta->iMirrorType); } //--- ポリ数を加算 ------------------------------------------ if(meta->iMirrorType){ meta->iPolyCount += iPoly * 2;} else { meta->iPolyCount += iPoly;} } iMetaCount += 3; meta->iMirrorType = 0; }