Jump to content

[SOLVED] Работа с PROP_ARRAY_STRUCT


photo

Recommended Posts

к сожалению у ComponentVariableArray нет методов для удаления и свапа параметров, т.к. в основном он планировался просто как read-only обертка над PropertyParameter

сделать это можно через дополнительные функции. чтото типа такого 

BlobPtr saveParameterToBlob(const PropertyParameterPtr &p)
{
	if (!p)
		return BlobPtr();

	BlobPtr blob = Unigine::Blob::create();
	p->saveState(blob);
	return blob;
}

bool restoreParameterFromBlob(const PropertyParameterPtr &p, const BlobPtr &blob)
{
	if (!p || !blob)
		return false;
	blob->seekSet(0);
	p->resetValue();
	return p->restoreState(blob);
}

void swap_parameters(const PropertyParameterPtr &p1, const PropertyParameterPtr &p2)
{
	if (p1 && p2)
	{
		BlobPtr data1 = saveParameterToBlob(p1);
		BlobPtr data2 = saveParameterToBlob(p2);
		restoreParameterFromBlob(p1, data2);
		restoreParameterFromBlob(p2, data1);
	}
}

void swap_parameters_from_array(const PropertyParameterPtr &param_ptr, int index1, int index2)
{
	if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY)
		return;
	int array_size = param_ptr->getArraySize();
	if (index1 >= array_size || index1 < 0 || index2 >= array_size || index2 < 0)
		return;
	PropertyParameterPtr p1 = param_ptr->getChild(index1);
	PropertyParameterPtr p2= param_ptr->getChild(index2);
	swap_parameters(p1, p2);
}

void remove_parameter_from_array(const PropertyParameterPtr &param_ptr, int index)
{
	if (index < 0)
		return;
	if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY)
		return;

	int array_size = param_ptr->getArraySize();
	if (index >= array_size)
		return;

	int new_array_size = array_size - 1;
	if (new_array_size == 0)
	{
		// Exceptional case, when it's no necessary to do anything.
		param_ptr->setArraySize(0);
		return;
	}

	for (int i = index+1; i < array_size; i++)
	{
		PropertyParameterPtr p1 = param_ptr->getChild(index);
		PropertyParameterPtr p2= param_ptr->getChild(index-1);
		swap_parameters(p1, p2);
	}
	param_ptr->setArraySize(new_array_size);
}

int AppSystemLogic::init()
{
	remove_parameter_from_array(prop_array_struct->getParameter(), 4); // удалить 4й элемент
	swap_parameters_from_array(prop_array_struct->getParameter(), 1,2); // поменять местами 1 и 2 элемент
	
	return 1;
}

 

 

 

Link to comment

@cash-metall Спасибо большое за ответ. Там в коде есть ошибка, ниже исправленный код.

 

BlobPtr saveParameterToBlob(const PropertyParameterPtr &p)
{
	if (!p)
		return BlobPtr();

	BlobPtr blob = Unigine::Blob::create();
	p->saveState(blob);
	return blob;
}

bool restoreParameterFromBlob(const PropertyParameterPtr &p, const BlobPtr &blob)
{
	if (!p || !blob)
		return false;
	blob->seekSet(0);
	p->resetValue();
	return p->restoreState(blob);
}

void swap_parameters(const PropertyParameterPtr &p1, const PropertyParameterPtr &p2)
{
	if (p1 && p2)
	{
		BlobPtr data1 = saveParameterToBlob(p1);
		BlobPtr data2 = saveParameterToBlob(p2);
		restoreParameterFromBlob(p1, data2);
		restoreParameterFromBlob(p2, data1);
	}
}

void swap_parameters_from_array(const PropertyParameterPtr &param_ptr, int index1, int index2)
{
	if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY)
		return;
	int array_size = param_ptr->getArraySize();
	if (index1 >= array_size || index1 < 0 || index2 >= array_size || index2 < 0)
		return;
	PropertyParameterPtr p1 = param_ptr->getChild(index1);
	PropertyParameterPtr p2= param_ptr->getChild(index2);
	swap_parameters(p1, p2);
}

void remove_parameter_from_array(const PropertyParameterPtr &param_ptr, int index)
{
	if (index < 0)
		return;
	if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY)
		return;

	int array_size = param_ptr->getArraySize();
	if (index >= array_size)
		return;

	int new_array_size = array_size - 1;
	if (new_array_size == 0)
	{
		// Exceptional case, when it's no necessary to do anything.
		param_ptr->setArraySize(0);
		return;
	}

	for (int i = index+1; i < array_size; i++)
	{
		PropertyParameterPtr p1 = param_ptr->getChild(i);
		PropertyParameterPtr p2= param_ptr->getChild(i-1);
		swap_parameters(p1, p2);
	}
	param_ptr->setArraySize(new_array_size);
}

int AppSystemLogic::init()
{
	remove_parameter_from_array(prop_array_struct->getParameter(), 4); // удалить 4й элемент
	swap_parameters_from_array(prop_array_struct->getParameter(), 1,2); // поменять местами 1 и 2 элемент
	
	return 1;
}

 

  • Like 1
Link to comment

да, действительно, вы правы

PropertyParameterPtr p1 = param_ptr->getChild(i);
PropertyParameterPtr p2= param_ptr->getChild(i-1);

 спасибо!

  • Thanks 1
Link to comment
  • silent changed the title to [SOLVED] Работа с PROP_ARRAY_STRUCT
×
×
  • Create New...