Проекты
GameDev.ru / Проекты / Форум / AvalancheProject - рендер движок под Free Pascal (4 стр)

AvalancheProject - рендер движок под Free Pascal (4 стр)

Страницы: 1 2 3 4 5 Следующая »
MrShoorУчастникwww14 июня 20185:37#45
skalogryz
Я уже сделал аналог твоего TTextLayout. Это интерфейс ITextLines
Редактору реально от него надо знать лишь одну вещь: "если я ткну в координаты XY, то в какие символы я попаду?". И сейчас такой метод есть: ITextLines.SymbolAt
А тому, кто рисует интерфейс нужно знать другую вещь: "я хочу подсветить символы с такого до такого в строке N, дай мне баундинг ректангл". И такой метод тоже есть ITextLines.GetBounds
Все, больше ничего там не нужно.

TTextControl возможно можно сделать таким как ты описал... Но опять же, это можно сделать максимум для не форматированного текста. Для рич едита TTextControl превратится в монстра внутри, как это обычно бывает. И костыли/затычки для случаев сингл лайн текста или неформатированного текста там точно не нужны.

> Но как, долго ты хочешь сидеть в рамках прямоугольника?!
Уже сейчас никто не мешает сидеть не в прямоугольнике.

> Например: сколько вариантов RichComboBox ты видел в Делфях?
Ни одного? Я просто не знаю зачем комбобоксу Rich редактирование.

skalogryzУчастникwww14 июня 20186:42#46
MrShoor
> Это интерфейс ITextLines
1) а разве он не ограничен обработкой прямоугольника заполненного текстом (setBounds)?
2) как организовать скроллинг? причём попиксельный. весь текст целиком выводить c клипом?

MrShoor
> "я хочу подсветить символы с такого до такого в строке N, дай мне баундинг ректангл".
> И такой метод тоже есть ITextLines.GetBounds
а если ещё и шрифтом поджирнить нужно?
понял. ITextBuilder позволяет менять шрифт, перед каждым кусом текста.

Про "в строке N" это тоже спорный момент.
Если у меня на входе какой-нить самопальный mark-up текст, то я скорее всего знаю какие символы от начала всего текста нужно подсветить.

+ пример

а так мне придётся ещё и символы считать...хм...
если я в Write(#13#10) передам, то перевод строки будет? (или так (поидее) нельзя делать?)

MrShoor
> Ни одного? Я просто не знаю зачем комбобоксу Rich редактирование.
Рич-редактирование конечным пользователем не нужно.
Но вот создавать разные эффекты задёшево (т.е. используя richedit функционал), люди любят.
Не говоря про отображение Rich содержимого (но это, конечно, обходится и другими путями)

Правка: 14 июня 2018 6:44

MrShoorУчастникwww14 июня 20187:45#47
skalogryz
> 1) а разве он не ограничен обработкой прямоугольника заполненного текстом
> (setBounds)?
SetBounds - это границы для выравнивания текста по вертикали и горизонтали. Т.е. ты можешь менять границы на ходу, без перестройки всего ITextLines

> а так мне придётся ещё и символы считать...хм...
Ну тут как бы или ты делаешь просто, или универсально но сложно. Я пока что адепт простоты, потому что сложное нужно очень редко.
С другой стороны ITextLines - это интерфейс. Никто не мешает написать реализацию, которая сама будет считать символы.

> если я в Write(#13#10) передам, то перевод строки будет? (или так (поидее)
> нельзя делать?)
Пока что перевода строки не будет, и пока непонятно надо его делать или нет. Во всяком случае добавить это легче легкого.

> Рич-редактирование конечным пользователем не нужно.
> Но вот создавать разные эффекты задёшево (т.е. используя richedit функционал),
> люди любят.
> Не говоря про отображение Rich содержимого (но это, конечно, обходится и
> другими путями)
И именно это сейчас и реализовано. Ты можешь создать ITextLines хоть побуквенно меняя стиль, а потом его нарисовать где захочешь.

skalogryzУчастникwww14 июня 201816:30#48
MrShoor
> SetBounds - это границы для выравнивания текста по вертикали и горизонтали.
> Т.е. ты можешь менять границы на ходу, без перестройки всего ITextLines
> ...
> И именно это сейчас и реализовано. Ты можешь создать ITextLines хоть побуквенно
> меняя стиль, а потом его нарисовать где захочешь.
Как организовать отступ для красной строки?
для этого нужно построить один ITextLines или несколько? (например, в тексте на 2 параграфа)
+ с одним ITextLines - никак?

MrShoor
> Ну тут как бы или ты делаешь просто, или универсально но сложно. Я пока что
> адепт простоты, потому что сложное нужно очень редко
а я ни в коем случае не предлагаю вносить изменение в существующий интерфейс или реализацию базовых классов.
я вполне понимаю и приветствую, когда движок написан с точки зрения простоты и элегантности.

Правка: 14 июня 2018 16:35

MrShoorУчастникwww14 июня 201818:35#49
skalogryz
> + с одним ITextLines - никак?
Оу, пока никак. :) ща позавтракаю и запилю метод.
MrShoorУчастникwww14 июня 201818:59#50
skalogryz
Добавил. Теперь ITextLines имеет метод WriteSpace.
skalogryzУчастникwww14 июня 201819:58#51
MrShoor
> Добавил. Теперь ITextLines имеет метод WriteSpace.
Ну блин, так нечестно. Ты же усложняешь реализацию/интерфейс ;)

я не хочу сказать, что интерфейс менять/расширять нельзя, но ты стал на шажочек ближе к TextLayout!

Но вопрос, опять, архитектуры: хочешь ли ты пихать всю эту хрень с вёрсткой (вроде межстрочного интервала, отступов) в ITextLines, или оставить ITextLines простым и базовым, позволить заниматься всем этим некой надройстке сверху?

имхо, с идеями, мне нужно сделать паузу до конца Nano конкурса

Правка: 14 июня 2018 20:08

MrShoorУчастникwww14 июня 201820:17#52
skalogryz
Я ошибся когда писал пост. Я добавил WriteSpace не в ITextLines, а в ITextBuilder. То есть ITextLines не усложнился.

skalogryz
> Но вопрос, опять, архитектуры: хочешь ли ты пихать всю эту хрень с вёрсткой
> (вроде межстрочного интервала, отступов) в ITextLines
Хочу пихать, но только в ITextBuilder. ITextLines содержит в себе только информацию по разметке.

skalogryzУчастникwww15 июня 20185:49#53
MrShoor
> добавил WriteSpace не в ITextLines, а в ITextBuilder. То есть ITextLines не усложнился.
ITextBuilder стремится в TextLayout. :)

реализация вызывает вопросы:

procedure TTextBuilder.WriteSpace(ASpace: Single);
begin
  InitLine;
  FLineInfo.width := FLineInfo.width + ASpace; // вот эта строчка!
  FPos.x := FPos.x + ASpace;
end;
работает идеально в тех случаях, когда красная строка сдвинута вправо.

А вот если она сдвинута влево (т.е. ASpace отрицательная), то не получается хорошо:

          boundsX
  |_____________________|
Привет мир Привет мир При
  вет мир Привет мир Прив
  ет мир Привет мир Приве
  т мир Привет мир Привет
   мир
длинна первой строки окажется на len('Пр')*2 короче, чем она есть на самом деле.

PS: мне это сейчас напомнило ту "печатающую машинку" которую мы используем на работе :)
может стоит добавить Offset - можно будет и по вертикали сдвигать. Но тогда принцип "работы по линиям" пропадает.

Правка: 15 июня 2018 5:55

MrShoorУчастникwww15 июня 20185:56#54
skalogryz
> ITextBuilder стремится в TextLayout. :)
А я про это в самом начале написал, что TextLayout не нужен, потому что есть ITextBuilder + ITextLines

> то не получается хорошо:
На экране выглядит вроде все логично. Сдвинул в минус, получил смещение в минус. А как должно быть то?

skalogryzУчастникwww15 июня 20185:59#55
MrShoor
> На экране выглядит вроде все логично. Сдвинул в минус, получил смещение в
> минус. А как должно быть то?
на экране логично, а вот MaxLineWidth() вернёт не то, что на экране. Как и LineSize()

Правка: 15 июня 2018 6:00

MrShoorУчастникwww15 июня 20186:02#56
skalogryz
> на экране логично, а вот MaxLineWidth() вернёт не то, что на экране.
Ну тут спорный вопрос, что в этом случае должен вернуть MaxLineWidth. Надо думать. Может быть правильно как раз так и оставить.

Правка: 15 июня 2018 6:02

skalogryzУчастникwww15 июня 20186:08#57
MrShoor
> Ну тут спорный вопрос, что в этом случае должен вернуть MaxLineWidth. Надо
> думать. Может быть правильно как раз так и оставить.
спорный, да.  Потому что усложняет подсчёт fWidth. (придётся следить за minx/maxx)

Для сравнения - GetBounds() вернёт правильный прямоугольник.
а следствие из этого: max(GetBounds()) <> MaxLineWidth.

Без отрицательных значений всё было просто!

Правка: 15 июня 2018 6:09

skalogryzУчастникwww19 июня 20186:58#58
продолжим квест.

apcc только под 64-битку собирается?
при компиляции под 32-битным

      if not TryStrToInt64(addrS, NativeInt(addr)) then Exit;
hlslcompiler.pas(178,50) Error: Call by var for arg no. 2 has to match exactly: Got "LongInt" expected "Int64"

лечится так:

function TryStrToNativeInt(const s: string; Out i : NativeInt) : boolean;
var
  Error : word;
begin
  Val(s, i, Error);
  Result:=Error=0;
end;

function ReparseOutput(const str: ID3DBlob; const incl: TIncludeAdapter): string;
...
      if not TryStrToNativeInt(addrS, NativeInt(addr)) then Exit;
...
 

MrShoorУчастникwww19 июня 20187:38#59
skalogryz
Забирай фикс.
Error только я на Integer поменял, иначе оно не компилилось под дельфой. :)
Страницы: 1 2 3 4 5 Следующая »

/ Форум / Проекты / Собираю команду

2001—2018 © GameDev.ru — Разработка игр