Exemplo n.º 1
0
void windy::content::environment::trigger_recalculation() {
		
	if (this->_timeline->triggers().empty()) {
		this->_timeline->frame_set(nullptr);
	} else {

		auto& frames = this->_timeline->frame_set()->frames();

		for (unsigned int i = 0; i < frames.size(); ++i) {
					
			auto frame = frames[i];
			// amount of triggers on the current frame, if zero, swaps key frame
			uint64_t trigger_timeline_counter = 0;
			for (auto vector : this->_timeline->triggers()) {
				for (auto trigger : vector) {
					if (trigger->frame() == i) {
						trigger_timeline_counter++;
					}
				}
			}

			if (trigger_timeline_counter == 0) { // zero triggers, swap key frame
				frame->is_key_frame(false);
			}

		}

		this->_timeline->recalculate();
		this->_timeline->recalculate_triggers();
	}

}
Exemplo n.º 2
0
void Commands_deleteKey(int track, int row)
{
	struct DeleteKeyData* data;
	Command* command;
	struct sync_track* t = s_syncTracks[track];
	
	if (!is_key_frame(t, row))
		return;
	
	command = malloc(sizeof(Command));
	memset(command, 0, sizeof(Command));

	command->userData = data = malloc(sizeof(struct DeleteKeyData));
	command->exec = execDeleteKey;
	command->undo = undoDeleteKey;
	data->track = track;
	data->row = row;

	execCommand(command);
}
Exemplo n.º 3
0
void Commands_addOrUpdateKey(int track, struct track_key* key)
{
	struct InsertKeyData* data;
	Command* command;
	struct sync_track* t = s_syncTracks[track];

	if (is_key_frame(t, key->row))
	{
		Commands_updateKey(track, key);
		return;
	}

	command = malloc(sizeof(Command));
	memset(command, 0, sizeof(Command));

	command->userData = data = malloc(sizeof(struct InsertKeyData));
	command->exec = execInsertKey;
	command->undo = undoInsertKey;
	data->track = track;
	data->key = *key;

	execCommand(command);
}
Exemplo n.º 4
0
static void parseXml(mxml_node_t* rootNode, TrackData* trackData)
{
	struct track_key k;
	int g, i, foldedGroupCount = 0, is_key, track_index = 0;
	mxml_node_t* node = rootNode;

	free(trackData->bookmarks);
	trackData->bookmarks = NULL;
	trackData->bookmarkCount = 0;
	trackData->highlightRowStep = 8;

	// Traverse the tracks node data

	while (1)
	{
		node = mxmlWalkNext(node, rootNode, MXML_DESCEND);

		if (!node)
			break;

		switch (mxmlGetType(node))
		{
			case MXML_ELEMENT:
			{
				const char* element_name = mxmlGetElement(node);

				if (!strcmp("bookmark", element_name))
				{
                    const char* row = mxmlElementGetAttr(node, "row");

                    if (row)
						TrackData_toggleBookmark(trackData, atoi(row));
				}

				if (!strcmp("group", element_name))
				{
                    s_foldedGroupNames[foldedGroupCount++] = strdup(mxmlElementGetAttr(node, "name"));
				}

				if (!strcmp("tracks", element_name))
				{
                    const char* start_row = mxmlElementGetAttr(node, "startRow");
                    const char* end_row = mxmlElementGetAttr(node, "endRow");
                    const char* hlrow_step = mxmlElementGetAttr(node, "highlightRowStep");

                    if (start_row)
						trackData->startRow = atoi(start_row);

                    if (end_row)
						trackData->endRow = atoi(end_row);

                    if (hlrow_step)
						trackData->highlightRowStep = atoi(hlrow_step);
				}

				if (!strcmp("track", element_name))
				{
					int i;
					struct sync_track* track;
					Track* t;

					// TODO: Create the new track/channel here
			
                    const char* track_name = mxmlElementGetAttr(node, "name");
                    const char* color_text = mxmlElementGetAttr(node, "color");
                    const char* folded_text = mxmlElementGetAttr(node, "folded");
                    
					track_index = TrackData_createGetTrack(trackData, track_name);

					t = &trackData->tracks[track_index];
					track = trackData->syncData.tracks[track_index];

					if (!color_text && t->color == 0)
					{
						t->color = TrackData_getNextColor(trackData);
					}
					else
					{
						if (color_text)
							t->color = strtoul(color_text, 0, 16);
					}

					if (folded_text)
					{
						if (folded_text[0] == '1')
							t->folded = true;
					}

					// If we already have this track loaded we delete all the existing keys
					
					for (i = 0; i < track->num_keys; ++i)
					{
						int row = track->keys[i].row;
						RemoteConnection_sendDeleteKeyCommand(track->name, row);
					}

					free(track->keys);

					track->keys = 0;
					track->num_keys = 0;
				}
				else if (!strcmp("key", element_name))
				{
					struct sync_track* track = trackData->syncData.tracks[track_index];

					const char* row = mxmlElementGetAttr(node, "row"); 
					const char* value = mxmlElementGetAttr(node, "value"); 
					const char* interpolation = mxmlElementGetAttr(node, "interpolation"); 

					k.row = atoi(row);
					k.value = (float)(atof(value));
					k.type = (atoi(interpolation));

					is_key = is_key_frame(track, k.row);

					assert(!is_key);
					sync_set_key(track, &k);

					RemoteConnection_sendSetKeyCommand(track->name, &k);
				}
			}

			default: break;
		}
	}

	TrackData_linkGroups(trackData);

	// Apply fold status on the groups

	for (i = 0; i < foldedGroupCount; ++i)
	{
		for (g = 0; g < trackData->groupCount; ++g)
		{
            Group* group = &trackData->groups[g];
            const char* groupName = group->name;
            const char* foldedName = s_foldedGroupNames[i];
         
            // groups with 1 track is handled as non-grouped
            
            if (group->trackCount == 1)
                continue;
            
			if (!strcmp(foldedName, groupName))
			{
				trackData->groups[g].folded = true;
				break;
			}
		}

		free(s_foldedGroupNames[i]);
	}

	trackData->tracks[0].selected = true;
}
Exemplo n.º 5
0
STDMETHODIMP CPackageForVideo::get_Key(VARIANT_BOOL* pVal)
{
	// TODO: 在此添加实现代码
	*pVal = is_key_frame() ? -1 : 0;
	return S_OK;
}
Exemplo n.º 6
0
SyncDocument *SyncDocument::load(const QString &fileName)
{
	SyncDocument *ret = new SyncDocument;
	ret->fileName = fileName;

	QFile file(fileName);
	if (!file.open(QIODevice::ReadOnly)) {
		QMessageBox::critical(NULL, "Error", file.errorString());
		return NULL;
	}

	QDomDocument doc;
	QString err;
	if (!doc.setContent(&file, &err)) {
		file.close();
		QMessageBox::critical(NULL, "Error", err);
		return NULL;
	}
	file.close();

	QDomNamedNodeMap attribs = doc.documentElement().attributes();
	QDomNode rowsParam = attribs.namedItem("rows");
	if (!rowsParam.isNull()) {
		QString rowsString = rowsParam.nodeValue();
		ret->setRows(rowsString.toInt());
	}

	QDomNodeList trackNodes =
	    doc.documentElement().elementsByTagName("track");
	for (int i = 0; i < int(trackNodes.length()); ++i) {
		QDomNode trackNode = trackNodes.item(i);
		QDomNamedNodeMap attribs = trackNode.attributes();

		QString name = attribs.namedItem("name").nodeValue();

		// look up track-name, create it if it doesn't exist
		int trackIndex = sync_find_track(ret, name.toUtf8());
		if (0 > trackIndex)
			trackIndex = int(ret->createTrack(name.toUtf8().constData()));

		QDomNodeList rowNodes = trackNode.childNodes();
		for (int i = 0; i < int(rowNodes.length()); ++i) {
			QDomNode keyNode = rowNodes.item(i);
			QString baseName = keyNode.nodeName();
			if (baseName == "key") {
				QDomNamedNodeMap rowAttribs = keyNode.attributes();
				QString rowString = rowAttribs.namedItem("row").nodeValue();
				QString valueString = rowAttribs.namedItem("value").nodeValue();
				QString interpolationString = rowAttribs.namedItem("interpolation").nodeValue();

				track_key k;
				k.row = rowString.toInt();
				k.value = valueString.toFloat();
				k.type = key_type(interpolationString.toInt());

				Q_ASSERT(!is_key_frame(ret->tracks[trackIndex], k.row));
				if (sync_set_key(ret->tracks[trackIndex], &k))
					qFatal("failed to insert key");
			}
		}
	}

	// YUCK: gathers from entire document
	QDomNodeList bookmarkNodes =
	    doc.documentElement().elementsByTagName("bookmark");
	for (int i = 0; i < int(bookmarkNodes.length()); ++i) {
		QDomNode bookmarkNode =
		    bookmarkNodes.item(i);
		QDomNamedNodeMap bookmarkAttribs =
		    bookmarkNode.attributes();
		QString str =
		    bookmarkAttribs.namedItem("row").nodeValue();
		int row = str.toInt();
		ret->toggleRowBookmark(row);
	}

	return ret;
}