Название: Запись "изменений" Отправлено: Igors от Август 26, 2015, 12:13 Добрый день
В задаче "запись данных анимации" (недавно обсуждалось) удалось обойтись без этого, но необходимость возникла в смежной задаче. Есть (большая) структура в памяти. В какой-то момент приходит ключ (или неск ключей). Если значение ключа ненулевое, то нужно сделать копию текущей структуры и в ней изменить значение полей по этому ключу. Псевдокод Код Нужно как-то идентифицировать какое поле менять и знать на что менять. В момент записи это известно, т.е. мы знаем что mAmount должно меняться, и мы имеем контейнер подставляемых значений из которых по ключу будет выбрано нужное. Как должна выглядеть реализация с точки зрения читающего (подставляющего)? Спасибо Название: Re: Запись "изменений" Отправлено: m_ax от Август 26, 2015, 14:09 Цитировать Как должна выглядеть реализация с точки зрения читающего (подставляющего)? Например так: Код
Название: Re: Запись "изменений" Отправлено: Igors от Август 27, 2015, 11:29 Пример, см аттач. Есть 3 кубика которые представлены как одна модель и используют один зкземпляр CData. Пусть mAmount - прозрачность текстуры которая должна быть разной для разных кубиков. Ясно что мы должны как-то отличать кубики друг от друга. Заметим что они могут рендеоиться в любом порядке, напр сначала точка 2-го (нужна одна прозрачность), потом точка первого (другая), потом опять второго. Поэтому вписываем ключи - (уникальные ID). В полигоны 1-го запишем 1, второго 2 и.т.д. Эта операция делается 1 раз на старте
Теперь нам надо превратить ID ключа в конкретные значения изменяемых параметров. Для этого в объекте есть такие данные 1) Что менять. Идентифицируется строкой (напр "Amount") один раз на старте. То есть mAmount меняется или всегда или никогда. 2) Массив данных для изменения, индивидуальный для каждого меняемого параметра. Загружается на старте и никогда не меняется. Напр там записано 2 значения 0.0f и 1.0f. Или 3 (1, 0,5, 0, 1) 3) Как менять, это число - номер метода или "способ замены". Напр число 1 значит "выбросить случайное число" (конечно используя ключ ID) и по нему выбрать значение из массива данных, возможно интерполируя С этой точки зрения зачем мне нужна мапа? На всякий случай напомню "в чем проблема" - параметров много (сотни) и любой(ые) из них может быть назначен "мутирующим", т.е. механизм изменений должен быть в общем виде Название: Re: Запись "изменений" Отправлено: m_ax от Август 28, 2015, 14:31 Цитировать Теперь нам надо превратить ID ключа в конкретные значения изменяемых параметров. Тогда напрашивается написать свой класс ключа, который знает что и как менять в том объекте к которому он приставлен.. Это уже даже и не ключ, а скорее набор харрактеристик и действий.. Название: Re: Запись "изменений" Отправлено: Igors от Август 30, 2015, 10:23 Тогда напрашивается написать свой класс ключа, который знает что и как менять в том объекте к которому он приставлен.. Для примера выше: ключ - идентификатор кубика (одного из многих), это просто число, без всякого интеллекта. Класс (выполняющий изменения) конечно есть, и конечно ключ он получает как аргумент. На основании этого ключа он вычислит "измененное значение", но нужен общий механизм куда это значение поместить (т.е. собственно поменять)Это уже даже и не ключ, а скорее набор харрактеристик и действий.. Название: Re: Запись "изменений" Отправлено: Old от Август 30, 2015, 12:42 m_ax говорит о чем-то типа этого:
Код У нас есть ключ и значения которые нужно изменить у этплонного объекта. Название: Re: Запись "изменений" Отправлено: m_ax от Август 30, 2015, 12:55 Цитировать m_ax говорит о чем-то типа этого: Да, именно так :) Название: Re: Запись "изменений" Отправлено: Igors от Август 30, 2015, 13:58 Да, именно так :) Не так :) Ключ - для генерации измененного значения, это не селектор изменяемого поля. С полем сделал такЦитировать { "Amount", offsetof(struct MyClass, mAmount) }, Жесткая макруха (Саня Грей ???) - но лучшего не видно{ "SomeVal", offsetof(struct MyClass, mSomeVal) } ... еще 100 таких |