/***** extProcCommand: コマンドメッセージ受信時処理 *****/ EXPORT void extProcCommand(MMDAgent *mmdagent, const char *type, const char *args) { if (enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGINSKELETON_NAME)) { enable = false; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINDISABLE, PLUGINSKELETON_NAME); } } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGINSKELETON_NAME)) { enable = true; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, PLUGINSKELETON_NAME); } } } }
/* extProcCommand: process command message */ EXPORT void extProcCommand(MMDAgent *mmdagent, const char *type, const char *args) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGINLOOKAT_NAME) && enable == false) changeLookAt(mmdagent->getModelList(), mmdagent->getNumModel(), mmdagent); } else if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGINLOOKAT_NAME) && enable == true) changeLookAt(mmdagent->getModelList(), mmdagent->getNumModel(), mmdagent); } }
/* InputArguments_match: match input */ static bool InputArguments_match(const InputArguments *ia, const InputArguments *input) { int i, j, k; bool match; if(ia == NULL) return false; if(input == NULL) { if(ia->size == 0) return true; else return false; } if(ia->size != input->size) return false; for(i = 0; i < ia->size; i++) { for(j = 0; j < ia->argc[i]; j++) { match = false; for(k = 0; k < input->argc[i]; k++) { if(MMDAgent_strequal(ia->args[i][j], input->args[i][k]) == true) { match = true; break; } } if(match == false) return false; } } return true; }
/* VIManager::transition: state transition (if jumped, return arc) */ VIManager_Arc *VIManager::transition(const char *itype, const InputArguments *iargs, char *otype, char *oargs) { VIManager_Arc *arc; VIManager_AList *arc_list; strcpy(otype, VIMANAGER_EPSILON); strcpy(oargs, ""); /* FST isn't loaded yet */ if (m_currentState == NULL) return NULL; /* state don't have arc list */ arc_list = &m_currentState->arc_list; if (arc_list->head == NULL) return NULL; /* match */ for (arc = arc_list->head; arc != NULL; arc = arc->next) { if(MMDAgent_strequal(arc->input_event_type, itype) == true && InputArguments_match(&arc->input_event_args, iargs) == true ) { strcpy(otype, arc->output_command_type); strcpy(oargs, arc->output_command_args); m_currentState = arc->next_state; return arc; } } return NULL; }
/* Variables::unset: unset value */ void Variables::unset(const char *alias) { Value *tmp1, *tmp2; for(tmp1 = m_head; tmp1; tmp1 = tmp2) { tmp2 = tmp1->next; if(MMDAgent_strequal(tmp1->name, alias)) { if(tmp1 == m_head) { if(tmp1 == m_tail) { m_head = NULL; m_tail = NULL; } else { m_head = tmp1->next; tmp1->next->prev = NULL; } } else { if(tmp1 == m_tail) { m_tail = tmp1->prev; tmp1->prev->next = NULL; } else { tmp1->next->prev = tmp1->prev; tmp1->prev->next = tmp1->prev; } } m_mmdagent->sendEventMessage(VARIABLES_VALUEUNSETEVENT, tmp1->name); /* send message */ free(tmp1->name); free(tmp1->sval); free(tmp1); break; } } }
/* Variables::evaluate: evaluate value */ void Variables::evaluate(const char *alias, const char *mode, const char *str) { Value *val; float f1, f2; bool ret; /* get value 1 */ for(val = m_head; val; val = val->next) { if(MMDAgent_strequal(val->name, alias) == true) { f1 = val->fval; break; } } if(val == NULL) return; /* get value 2 */ f2 = MMDAgent_str2float(str); /* evaluate */ if(MMDAgent_strequal(mode, VARIABLES_EQ) == true) { if(f1 == f2) ret = true; else ret = false; } else if(MMDAgent_strequal(mode, VARIABLES_NE) == true) { if(f1 != f2) ret = true; else ret = false; } else if(MMDAgent_strequal(mode, VARIABLES_LE) == true) { if(f1 <= f2) ret = true; else ret = false; } else if(MMDAgent_strequal(mode, VARIABLES_LT) == true) { if(f1 < f2) ret = true; else ret = false; } else if(MMDAgent_strequal(mode, VARIABLES_GE) == true) { if(f1 >= f2) ret = true; else ret = false; } else if(MMDAgent_strequal(mode, VARIABLES_GT) == true) { if(f1 > f2) ret = true; else ret = false; } else { /* unknown mode */ return; } if(ret == true) m_mmdagent->sendEventMessage(VARIABLES_VALUEEVALEVENT, "%s|%s|%s|%s", alias, mode, str, VARIABLES_TRUE); else m_mmdagent->sendEventMessage(VARIABLES_VALUEEVALEVENT, "%s|%s|%s|%s", alias, mode, str, VARIABLES_FALSE); }
/* extProcEvent: process event message */ EXPORT void extProcEvent(MMDAgent *mmdagent, const char *type, const char *args) { char *parse; if (enable == true && MMDAgent_strequal(type, SPHINXTHREAD_EVENTSTOP)) { parse = phoenix.parseUtterance(args); if (parse != NULL & strlen(parse) != 0) mmdagent->sendEventMessage(PLUGINPHOENIX_STOPEVENT, parse); } }
/* Variables::set: set value */ void Variables::set(const char *alias, const char *str1, const char *str2) { Value *val; float max, min, tmp; if(MMDAgent_strlen(alias) <= 0) return; /* check the same alias */ for(val = m_head; val; val = val->next) { if(MMDAgent_strequal(val->name, alias)) break; } /* push */ if(val == NULL) { val = (Value *) malloc(sizeof(Value)); val->name = MMDAgent_strdup(alias); val->next = NULL; if(m_tail == NULL) { m_head = val; val->prev = NULL; } else { m_tail->next = val; val->prev = m_tail; } m_tail = val; } else { free(val->sval); } /* set string */ if(str2 == NULL) { val->sval = MMDAgent_strdup(str1); } else { val->sval = (char *) malloc(sizeof(char) * (MMDAgent_strlen(str1) + 1 + MMDAgent_strlen(str2) + 1)); sprintf(val->sval, "%s|%s", str1, str2); } /* set float */ if(str2 == NULL) { val->fval = MMDAgent_str2float(str1); } else { min = MMDAgent_str2float(str1); max = MMDAgent_str2float(str2); if(max < min) { tmp = max; max = min; min = tmp; } val->fval = min + (max - min) * (rand() - 0.0f) * (1.0f / (RAND_MAX - 0.0f)); /* 0.0f is RAND_MIN */ } m_mmdagent->sendEventMessage(VARIABLES_VALUESETEVENT, alias); /* send message */ }
/* extProcEvent: process event message */ EXPORT void extProcEvent(MMDAgent *mmdagent, const char *type, const char *args) { int i, id; char *p, *buf, *save; PMDObject *objs; ControllerList *tmp1, *tmp2 = NULL; objs = mmdagent->getModelList(); if(MMDAgent_strequal(type, MMDAGENT_EVENT_KEY)) { if(MMDAgent_strequal(args, "l") || MMDAgent_strequal(args, "L")) { changeLookAt(objs, mmdagent->getNumModel(), mmdagent); } } else if(MMDAgent_strequal(type, MMDAGENT_EVENT_MODELCHANGE) || MMDAgent_strequal(type, MMDAGENT_EVENT_MODELADD)) { buf = MMDAgent_strdup(args); p = MMDAgent_strtok(buf, "|", &save); if(p) { id = mmdagent->findModelAlias(p); if(id != -1) { for(i = 0, tmp1 = controllerList; i <= id; i++) { if(tmp1 == NULL) { tmp1 = new ControllerList; tmp1->next = NULL; if(i == 0) controllerList = tmp1; else tmp2->next = tmp1; } if(i == id) { setHeadController(&tmp1->head, objs[id].getPMDModel()); setEyeController(&tmp1->eye, objs[id].getPMDModel()); tmp1->head.setEnableFlag(enable); tmp1->eye.setEnableFlag(enable); } tmp2 = tmp1; tmp1 = tmp1->next; } } } if(buf != NULL) free(buf); } }
/* Variables::get: get value */ void Variables::get(const char *alias) { Value *val; for(val = m_head; val; val = val->next) { if(MMDAgent_strequal(val->name, alias) == true) { m_mmdagent->sendEventMessage(VARIABLES_VALUEGETEVENT, "%s|%s", alias, val->sval); return; } } }
/* extProcMessage: process message */ EXPORT void extProcMessage(MMDAgent *mmdagent, const char *type, const char *args) { if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGINVIMANAGER_NAME)) { enable = false; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINDISABLE, "%s", PLUGINVIMANAGER_NAME); } } else if (vimanager_thread.isRunning()) { if (type != NULL) { vimanager_thread.enqueueBuffer(type, args); /* enqueue */ } } if(MMDAgent_strequal(type, MMDAGENT_EVENT_KEY) && MMDAgent_strequal(args, "F")) { if(enable_log == true) enable_log = false; else enable_log = true; } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGINVIMANAGER_NAME)) { enable = true; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, "%s", PLUGINVIMANAGER_NAME); } } } }
static void Audio_waitToStop(Audio *audio, const char *alias, bool *m_playing) { do { /* check user's stop */ if(*m_playing == false) { sprintf(audio->buf, "stop _%s wait", alias); mciSendStringA(audio->buf, NULL, 0, NULL); break; } MMDAgent_sleep(AUDIOTHREAD_ENDSLEEPMS); /* check end of sound */ sprintf(audio->buf, "status _%s mode wait", alias); mciSendStringA(audio->buf, audio->ret, sizeof(audio->ret), NULL); } while(MMDAgent_strequal(audio->ret, "playing") == true); }
/* checkAlias: check playing alias */ bool Audio_Thread::checkAlias(const char *alias) { bool ret; /* check */ if(isRunning() == false) return false; /* wait buffer mutex */ glfwLockMutex(m_mutex); /* save character name, speaking style, and text */ ret = MMDAgent_strequal(m_alias, alias); /* release buffer mutex */ glfwUnlockMutex(m_mutex); return ret; }
/* checkAlias: check playing alias */ bool Audio_Thread::checkAlias(const char *alias) { bool ret; /* check */ if(isRunning() == false) return false; /* wait buffer mutex */ glfwLockMutex(m_mutex); /* check audio alias */ ret = MMDAgent_strequal(m_alias, alias); /* release buffer mutex */ glfwUnlockMutex(m_mutex); return ret; }
static bool Audio_openAndStart(Audio *audio, const char *alias, char *file) { bool first = true; /* wait */ sprintf(audio->buf, "open \"%s\" alias _%s wait", file, alias); if (mciSendStringA(audio->buf, NULL, 0, 0) != 0) { return false; } /* enqueue */ sprintf(audio->buf, "cue _%s output wait", alias); if (mciSendStringA(audio->buf, NULL, 0, 0) != 0) { sprintf(audio->buf, "close _%s wait", alias); mciSendStringA(audio->buf, NULL, 0, 0); return false; } /* start */ sprintf(audio->buf, "play _%s", alias); if (mciSendStringA(audio->buf, NULL, 0, 0) != 0) { sprintf(audio->buf, "close _%s wait", alias); mciSendStringA(audio->buf, NULL, 0, 0); return false; } /* wait till sound starts */ do { if(first == true) first = false; else MMDAgent_sleep(AUDIOTHREAD_STARTSLEEPMS); /* check sound start */ sprintf(audio->buf, "status _%s mode wait", alias); mciSendStringA(audio->buf, audio->ret, sizeof(audio->ret), NULL); } while(MMDAgent_strequal(audio->ret, "playing") == false); return true; }
/* extProcCommand: process command message */ EXPORT void extProcCommand(MMDAgent *mmdagent, const char *type, const char *args) { if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE) == true) { if(MMDAgent_strequal(args, PLUGINWINDOWCONTROLLER_NAME)) { enable = false; mmdagent->sendEventMessage(MMDAGENT_EVENT_PLUGINDISABLE, PLUGINWINDOWCONTROLLER_NAME); } } else if(MMDAgent_strequal(type, PLUGINWINDOWCONTROLLER_EXECUTE) == true) { if(MMDAgent_strlen(args) > 0) ShellExecuteA(NULL, NULL, args, NULL, NULL, SW_SHOWNORMAL); } else if(MMDAgent_strequal(type, PLUGINWINDOWCONTROLLER_KEYPOST) == true) { postKeyMessage(args); } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE) == true) { if(MMDAgent_strequal(args, PLUGINWINDOWCONTROLLER_NAME) == true) { enable = true; mmdagent->sendEventMessage(MMDAGENT_EVENT_PLUGINENABLE, PLUGINWINDOWCONTROLLER_NAME); } } } }
/* extProcMessage: process message */ EXPORT void extProcMessage(MMDAgent *mmdagent, const char *type, const char *args) { if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGININTERFACE_NAME)) { enable = false; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINDISABLE, "%s", PLUGININTERFACE_NAME); } } else if (interface_manager.isRunning()) { if (MMDAgent_strequal(type, PLUGININTERFACE_STARTCOMMAND)) { interface_manager.start(args); } else if (MMDAgent_strequal(type, PLUGININTERFACE_STOPCOMMAND)) { interface_manager.stop(args); } } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGININTERFACE_NAME)) { enable = true; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, "%s", PLUGININTERFACE_NAME); } } } }
/* extProcMessage: process message */ EXPORT void extProcMessage(MMDAgent *mmdagent, const char *type, const char *args) { if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGINOPENJTALK_NAME)) { enable = false; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINDISABLE, "%s", PLUGINOPENJTALK_NAME); } } else if (open_jtalk_manager.isRunning()) { if (MMDAgent_strequal(type, PLUGINOPENJTALK_STARTCOMMAND)) { open_jtalk_manager.synthesis(args); } else if (MMDAgent_strequal(type, PLUGINOPENJTALK_STOPCOMMAND)) { open_jtalk_manager.stop(args); } } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGINOPENJTALK_NAME)) { enable = true; mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, "%s", PLUGINOPENJTALK_NAME); } } } }
/* extProcCommand: process command message */ EXPORT void extProcCommand(MMDAgent *mmdagent, const char *type, const char *args) { if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINDISABLE)) { if(MMDAgent_strequal(args, PLUGINAUDIO_NAME)) { enable = false; mmdagent->sendEventMessage(MMDAGENT_EVENT_PLUGINDISABLE, PLUGINAUDIO_NAME); } } else if (audio_manager.isRunning()) { if (MMDAgent_strequal(type, PLUGINAUDIO_STARTCOMMAND)) { audio_manager.play(args); } else if (MMDAgent_strequal(type, PLUGINAUDIO_STOPCOMMAND)) { audio_manager.stop(args); } } } else { if(MMDAgent_strequal(type, MMDAGENT_COMMAND_PLUGINENABLE)) { if(MMDAgent_strequal(args, PLUGINAUDIO_NAME)) { enable = true; mmdagent->sendEventMessage(MMDAGENT_EVENT_PLUGINENABLE, PLUGINAUDIO_NAME); } } } }
/* VIManager::transition: state transition (if jumped, return arc) */ VIManager_Arc *VIManager::transition(const char *itype, const char *iargs, char *otype, char *oargs) { int i, j; int jumped = 0; VIManager_Arc *arc; VIManager_AList *arc_list; char **args; int argc; strcpy(otype, VIMANAGER_EPSILON); strcpy(oargs, ""); /* FST isn't loaded yet */ if (m_currentState == NULL) return NULL; /* state don't have arc list */ arc_list = &m_currentState->arc_list; if (arc_list->head == NULL) return NULL; /* get input event args */ getArgs(iargs, &args, &argc); /* matching */ for (arc = arc_list->head; arc != NULL; arc = arc->next) { if (MMDAgent_strequal(itype, arc->input_event_type)) { if (MMDAgent_strequal(itype, VIMANAGER_RECOG_EVENT_STOP)) { /* for recognition event */ for (i = 0; i < arc->input_event_argc; i++) { jumped = 0; for (j = 0; j < argc; j++) { if (MMDAgent_strequal(arc->input_event_args[i], args[j])) { jumped = 1; break; } } if (jumped == 0) break; } } else if (argc == arc->input_event_argc) { /* for others */ jumped = 1; for (i = 0; i < argc; i++) { if (MMDAgent_strequal(args[i], arc->input_event_args[i]) == false) { jumped = 0; break; } } } if (jumped) { /* state transition */ strcpy(otype, arc->output_command_type); strcpy(oargs, arc->output_command_args); m_currentState = arc->next_state; break; } } } if (argc > 0) { for (i = 0; i < argc; i++) free(args[i]); free(args); } return arc; }
/* LipSync::createMotion: create motion from phoneme sequence */ bool LipSync::createMotion(const char *str, unsigned char **rawData, unsigned long *rawSize) { int i, j, k; int len; char *buf, *p, *save; LipKeyFrame *head, *tail, *tmp1, *tmp2; float f, diff; int totalNumKey; unsigned long currentFrame; unsigned char *data; VMDFile_Header *header; unsigned long *numBoneKeyFrames; unsigned long *numFaceKeyFrames; VMDFile_FaceFrame *face; /* check */ if(str == NULL || m_numMotion <= 0 || m_numPhone <= 0) return false; /* initialize */ (*rawData) = NULL; (*rawSize) = 0; /* get phone index and duration */ buf = MMDAgent_strdup(str); head = NULL; tail = NULL; diff = 0.0f; for(i = 0, k = 0, p = MMDAgent_strtok(buf, LIPSYNC_SEPARATOR, &save); p; i++, p = MMDAgent_strtok(NULL, LIPSYNC_SEPARATOR, &save)) { if(i % 2 == 0) { for(j = 0; j < m_numPhone; j++) { if(MMDAgent_strequal(m_phone[j], p)) { k = j; break; } } if(m_numPhone <= j) k = 0; } else { tmp1 = (LipKeyFrame *) malloc(sizeof(LipKeyFrame)); tmp1->phone = k; f = 0.03f * MMDAgent_str2float(p) + diff; /* convert ms to frame */ tmp1->duration = (int) (f + 0.5); if(tmp1->duration < 1) tmp1->duration = 1; diff = f - tmp1->duration; tmp1->rate = 1.0f; tmp1->next = NULL; if(head == NULL) head = tmp1; else tail->next = tmp1; tail = tmp1; } } /* add final closed lip */ tmp1 = (LipKeyFrame *) malloc(sizeof(LipKeyFrame)); tmp1->phone = 0; tmp1->duration = 1; tmp1->rate = 0.0f; tmp1->next = NULL; if(head == NULL) head = tmp1; else tail->next = tmp1; tail = tmp1; /* insert interpolation lip motion */ for(tmp1 = head; tmp1; tmp1 = tmp1->next) { if(tmp1->next && tmp1->duration > LIPSYNC_INTERPOLATIONMARGIN) { tmp2 = (LipKeyFrame *) malloc(sizeof(LipKeyFrame)); tmp2->phone = tmp1->phone; tmp2->duration = LIPSYNC_INTERPOLATIONMARGIN; tmp2->rate = tmp1->rate * LIPSYNC_INTERPOLATIONRATE; tmp2->next = tmp1->next; tmp1->duration -= LIPSYNC_INTERPOLATIONMARGIN; tmp1->next = tmp2; tmp2 = tmp1; } } /* count length of key frame */ len = 0; for(tmp1 = head; tmp1; tmp1 = tmp1->next) len++; totalNumKey = m_numMotion * len; /* create memories */ (*rawSize) = sizeof(VMDFile_Header) + sizeof(unsigned long) + sizeof(unsigned long) + sizeof(VMDFile_FaceFrame) * totalNumKey; i = (*rawSize); i = sizeof(unsigned char) * (*rawSize); (*rawData) = (unsigned char *) malloc(i); data = (*rawData); /* header */ header = (VMDFile_Header *) data; strncpy(header->header, "Vocaloid Motion Data 0002", 30); data += sizeof(VMDFile_Header); /* number of key frame for bone */ numBoneKeyFrames = (unsigned long *) data; (*numBoneKeyFrames) = 0; data += sizeof(unsigned long); /* number of key frame for expression */ numFaceKeyFrames = (unsigned long *) data; (*numFaceKeyFrames) = totalNumKey; data += sizeof(unsigned long); /* set key frame */ for (i = 0; i < m_numMotion; i++) { currentFrame = 0; for(tmp1 = head; tmp1; tmp1 = tmp1->next) { face = (VMDFile_FaceFrame *) data; strncpy(face->name, m_motion[i], 15); face->keyFrame = currentFrame; face->weight = m_blendRate[tmp1->phone][i] * tmp1->rate; data += sizeof(VMDFile_FaceFrame); currentFrame += tmp1->duration; } } /* free */ free(buf); for(tmp1 = head; tmp1; tmp1 = tmp2) { tmp2 = tmp1->next; free(tmp1); } return true; }
/* Option::load: load options from config file */ bool Option::load(const char *file) { FILE *fp; char buf[OPTION_MAXBUFLEN]; int len; char *p1; int ivec2[2]; float fvec3[3]; float fvec4[4]; fp = MMDAgent_fopen(file, "r"); if (fp == NULL) return false; while (fgets(buf, OPTION_MAXBUFLEN, fp)) { len = MMDAgent_strlen(buf); if(len <= 0) continue; p1 = &(buf[len - 1]); while (p1 >= &(buf[0]) && (*p1 == '\n' || *p1 == '\r' || *p1 == '\t' || *p1 == ' ')) { *p1 = L'\0'; p1--; } p1 = &(buf[0]); if (*p1 == '#') continue; while (*p1 != L'=' && *p1 != L'\0') p1++; if (*p1 == L'\0') continue; *p1 = L'\0'; p1++; /* overwrite option values */ if(MMDAgent_strequal(buf, OPTION_USECARTOONRENDERING_STR)) { setUseCartoonRendering(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_USEMMDLIKECARTOON_STR)) { setUseMMDLikeCartoon(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGEWIDTH_STR)) { setCartoonEdgeWidth(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGESTEP_STR)) { setCartoonEdgeStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGESELECTEDCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec4, 4)) setCartoonEdgeSelectedColor(fvec4); } else if(MMDAgent_strequal(buf, OPTION_CAMERAROTATION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCameraRotation(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMERATRANSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCameraTransition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMERADISTANCE_STR)) { setCameraDistance(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CAMERAFOVY_STR)) { setCameraFovy(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_STAGESIZE_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setStageSize(fvec3); } else if(MMDAgent_strequal(buf, OPTION_SHOWFPS_STR)) { setShowFps(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_FPSPOSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setFpsPosition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_WINDOWSIZE_STR)) { if(MMDAgent_str2ivec(p1, ivec2, 2)) setWindowSize(ivec2); } else if(MMDAgent_strequal(buf, OPTION_FULLSCREEN_STR)) { setFullScreen(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_LOGSIZE_STR)) { if(MMDAgent_str2ivec(p1, ivec2, 2)) setLogSize(ivec2); } else if(MMDAgent_strequal(buf, OPTION_LOGPOSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setLogPosition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_LOGSCALE_STR)) { setLogScale(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIGHTDIRECTION_STR)) { if(MMDAgent_str2fvec(p1, fvec4, 4)) setLightDirection(fvec4); } else if(MMDAgent_strequal(buf, OPTION_LIGHTINTENSITY_STR)) { setLightIntensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIGHTCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setLightColor(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMPUSCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCampusColor(fvec3); } else if(MMDAgent_strequal(buf, OPTION_MAXMULTISAMPLING_STR)) { setMaxMultiSampling(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_MOTIONADJUSTTIME_STR)) { setMotionAdjustTime(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIPSYNCPRIORITY_STR)) { setLipsyncPriority(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_BULLETFPS_STR)) { setBulletFps(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_GRAVITYFACTOR_STR)) { setGravityFactor(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_ROTATESTEP_STR)) { setRotateStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_TRANSLATESTEP_STR)) { setTranslateStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_DISTANCESTEP_STR)) { setDistanceStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_FOVYSTEP_STR)) { setFovyStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_USESHADOWMAPPING_STR)) { setUseShadowMapping(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGTEXTURESIZE_STR)) { setShadowMappingTextureSize(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGSELFDENSITY_STR)) { setShadowMappingSelfDensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGFLOORDENSITY_STR)) { setShadowMappingFloorDensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGLIGHTFIRST_STR)) { setShadowMappingLightFirst(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_DISPLAYCOMMENTTIME_STR)) { setDisplayCommentTime(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_MAXNUMMODEL_STR)) { setMaxNumModel(MMDAgent_str2int(p1)); } } fclose(fp); return true; }
/* postKeyMessage: post key message */ static void postKeyMessage(const char *args) { int i; char *buff, *param1, *param2, *param3, *param4, *param5, *save; HWND window; unsigned int id = 0; INPUT input[8]; int size; bool alt = false, ctrl = false, shift = false; LPARAM info; buff = MMDAgent_strdup(args); param1 = MMDAgent_strtok(buff, "|", &save); /* window name */ param2 = MMDAgent_strtok(NULL, "|", &save); /* key */ param3 = MMDAgent_strtok(NULL, "|", &save); /* shift-key */ param4 = MMDAgent_strtok(NULL, "|", &save); /* control-key */ param5 = MMDAgent_strtok(NULL, "|", &save); /* alt-key */ /* check */ if(buff == NULL || param1 == NULL || param2 == NULL) { free(buff); return; } /* get window handle */ window = FindWindowA(param1, NULL); if(window == 0) { free(buff); return; } /* get key ID */ if(MMDAgent_strlen(param2) == 1) { id = toupper(param2[0]); } else { for(i = 0; keys[i].name != NULL; i++) { if(MMDAgent_strequal(param2, keys[i].name) == true) { id = keys[i].id; break; } } } if(id == 0) { free(buff); return; } /* set forground window */ SetForegroundWindow(window); /* get options */ shift = MMDAgent_strequal(param3, "ON"); ctrl = MMDAgent_strequal(param4, "ON"); alt = MMDAgent_strequal(param5, "ON"); /* create key message */ size = 0; info = GetMessageExtraInfo(); if(shift == true && id != VK_SHIFT) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_SHIFT; input[size].ki.wScan = MapVirtualKey(VK_SHIFT, 0); input[size].ki.dwFlags = 0; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } if(ctrl == true && id != VK_CONTROL) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_CONTROL; input[size].ki.wScan = MapVirtualKey(VK_CONTROL, 0); input[size].ki.dwFlags = 0; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } if(alt == true && id != VK_MENU) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_MENU; input[size].ki.wScan = MapVirtualKey(VK_MENU, 0); input[size].ki.dwFlags = 0; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = id; input[size].ki.wScan = MapVirtualKey(id, 0); input[size].ki.dwFlags = 0; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = id; input[size].ki.wScan = MapVirtualKey(id, 0); input[size].ki.dwFlags = KEYEVENTF_KEYUP; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; if(alt == true && id != VK_MENU) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_MENU; input[size].ki.wScan = MapVirtualKey(VK_MENU, 0); input[size].ki.dwFlags = KEYEVENTF_KEYUP; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } if(ctrl == true && id != VK_CONTROL) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_CONTROL; input[size].ki.wScan = MapVirtualKey(VK_CONTROL, 0); input[size].ki.dwFlags = KEYEVENTF_KEYUP; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } if(shift == true && id != VK_SHIFT) { input[size].type = INPUT_KEYBOARD; input[size].ki.wVk = VK_SHIFT; input[size].ki.wScan = MapVirtualKey(VK_SHIFT, 0); input[size].ki.dwFlags = KEYEVENTF_KEYUP; input[size].ki.time = 0; input[size].ki.dwExtraInfo = info; size++; } /* send key message */ SendInput(size, input, sizeof(INPUT)); free(buff); }
/* extProcEvent: process event message */ EXPORT void extProcEvent(MMDAgent *mmdagent, const char *type, const char *args) { int i; FILE *fp; char *buf, *p, *q; PMDObject *objs; MotionPlayer *motionPlayer; if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_EVENT_DRAGANDDROP)) { buf = MMDAgent_strdup(args); p = MMDAgent_strtok(buf, "|", &q); if(MMDAgent_strtailmatch(p, ".mp3") || MMDAgent_strtailmatch(p, ".MP3")) { /* if there is a motion file which have the same name, store it */ if(drop_motion != NULL) free(drop_motion); drop_motion = MMDAgent_strdup(p); i = MMDAgent_strlen(drop_motion); drop_motion[i-4] = '.'; drop_motion[i-3] = 'v'; drop_motion[i-2] = 'm'; drop_motion[i-1] = 'd'; fp = MMDAgent_fopen(drop_motion, "rb"); if(fp != NULL) { fclose(fp); } else { free(drop_motion); drop_motion = NULL; } /* start mp3 */ audio_manager.stop(PLUGINAUDIO_DEFAULTALIAS); q = (char *) malloc(sizeof(char) * (strlen(PLUGINAUDIO_DEFAULTALIAS) + 1 + strlen(p) + 1)); sprintf(q, "%s|%s", PLUGINAUDIO_DEFAULTALIAS, p); audio_manager.play(q); free(q); } if(buf) free(buf); } else if(MMDAgent_strequal(type, AUDIOTHREAD_EVENTSTART)) { if(drop_motion != NULL) { if(MMDAgent_strequal(args, PLUGINAUDIO_DEFAULTALIAS) == true) { objs = mmdagent->getModelList(); for (i = 0; i < mmdagent->getNumModel(); i++) { if (objs[i].isEnable() == true && objs[i].allowMotionFileDrop() == true) { for (motionPlayer = objs[i].getMotionManager()->getMotionPlayerList(); motionPlayer; motionPlayer = motionPlayer->next) { if (motionPlayer->active == true && MMDAgent_strequal(motionPlayer->name, "base") == true) { mmdagent->sendCommandMessage(MMDAGENT_COMMAND_MOTIONCHANGE, "%s|%s|%s", objs[i].getAlias(), "base", drop_motion); break; } } if (!motionPlayer) mmdagent->sendCommandMessage(MMDAGENT_COMMAND_MOTIONADD, "%s|%s|%s|FULL|ONCE|ON|ON", objs[i].getAlias(), "base", drop_motion); } } mmdagent->resetAdjustmentTimer(); } free(drop_motion); drop_motion = NULL; } } } }