Войти
ФлеймФорумПрограммирование

c++ пропечатка текста через OpenGL

Страницы: 1 2 Следующая »
#0
21:35, 28 июня 2011

У меня есть самодельные процедуры.
Но если кто-то знает готовую библиотеку, то подскажите, где её скачать.

Я собрался делать для себя очередную версию процедур печати букв.

Как это примерно выглядит у меня сейчас.

#include "print_buf.h" // вносим набор процедур.
extern t_print1  print1;  // вытаскиваем Агента, который создан в модуле print_buf.cpp
// Наверно, можно ограничиться нэйм-спэйсом аля  pb::

print1.LoadUni( "BaseRes/Fonts"); // Подготовимся - нагружаем Агента инструментами
// pb::LoadUni

print1.frz( "Test", nom_font,  x, y,   0,0,EkranW,EkranH); // печатаем
// pb::frz( сам текст, номер шрифта, //жирная версия шрифта считается другим шрифтом

// -------
Процедура LoadUni загружает в OpenGL текстуры с буквами и создаёт инфо для каждой буквы
(текстурные кардины, ширина, что-нить ещё).
Uni в названии, чтобы было без разницы грузить из текстового или бинарного файла.

void frz( char* fraza, ...
void frz( std::string sfraza, ...
Процедура установит текстуру нужного шрифта и, с указаного места,
построит-накидает в буфер вершины полигонов-квадратов для букв - отправит вершины на отрисовку.

Четыре последних параметра процедуры участвуют в создании проекции gluOrtho2D( ) .
// Буквы будут в другом масштабе, когда аргументы не сходятся с габаритами экрана.
Но я пока не узрел у себя на практике нужности таких габаритов-масштабов.
Везде использовал "на весь экран".

print1.frz( "Test", x, y, nom_font);
Возможно, так будет уместней.

// ---
Пока сомневаюсь, но квады можно рисовать и в три-мерной проекции.
А в моей старой версии печатного модуля используется glListBase glCallLists и сомнений быть не могло ))


#1
23:08, 28 июня 2011

hot story, bro

#2
23:14, 28 июня 2011

Сначало хотел посоветовать Ctrl+A + Delete

Передумал,может поможет:
http://www.opengl.org/resources/features/fontsurvey/

#3
18:58, 6 июля 2011


// ------
// Пропечатка меню и букв, как набор дву-мерных квадратиков.

Класика жанра - нужно создать Canvas и его методами что-нить штамповать-печатать на нём.
У меня роль "полотна" будет играть особый клас-предмет - дерево кнопок - пока не знаю
как его назвать (print или Mix2D или RTab).
Корнем дерева всех элементов GUI, корнем всех кнопок, будет кнопка, растянутая поверх
всего окна моей програмы. Каждая кнопка может содержать масив-вектор из других кнопок
и два номерка на скрипты (реакция на событие сигнала и врезка в цикл аля рисование OnDraw).
// Номерки могут переводить маркер проги на имиту скриптов - на вкомпилированые процедуры.

Нужно подобрать серию публичных методов для удобства..
1. Создание-иница всего дерева из какого-то файла.
2. Добавление в дерево кучки элементов из какого-то файла.
3. Серия редактирования - например, подвинуть кнопку или изменить размер.
...
Вероятно, публичные процедуры можно вызывать из скриптов, либо составить особый список проц,
которые можно из скриптов вызывать.
Но из вкомпилированой имиты скриптов можно все публичные вызывать.

При создании кнопки, ей даём номерок кейса, в котором будут вызваны методы рисования.
В подобных кейсах пользуем спец-процедуры, где накачивают цепочку заказов на отрисовку.
Все нормальные вызовы, по отрисовке кнопок меню, реализуют себя через один или два текстур-атласа,
где собраны буквы всех нужных шрифтов (штук 10 шрифтов) и кусочки оформления всех кнопок.
Иногда, среди заказов, нужно нарисовать какую-то илюстрацию, которая будет отдельной текстурой.
Поэтому при выявлении "не стандартного" заказа, мы спихиваем накопленые вершины (батч) на видео-чип.
После этого меняем материал, печатаем свободную картинку, а потом снова накапливаем новый батч.

Кнопка рисуется из узорчиков, которые должны быть систематизированы как особый шрифт,
чтобы можно было делать вариации стиля - нужно составить список узорчиков для кнопок.
// Построение полигонов (quad) можно делать хитрое - круглые углы полигонами, либо ребро
// из двух полосок, чтобы можно было делать градиент поперёк, от середины на край.
1. Пустое место (по альфе).
2. Белый квадрик - как сама плоскость полигона - RGBA вершин могут делать градиенты.
3. Моно-уголок - 4 разных индекса в шрифте, но изображение одно (текс-кардинами искажаем).
4 5 6 7. Свето-теневые подробные-резные уголки.
8. Элемент частокола. // Частокол из честных квадов - так и градиент повторяющемуся узору возможен.
9. Целая кнопка аля квадрик (окей-закрыть-свернуть).
10. кружок (радио-батон).
11. галочка.
Возможно, этих квадриков, кружков, полу-кругов нужно побольше - можно пульсировать размером.
Далее в текстуре элементов кнопок, могут быть всякие полу-стандартные значки-иконки.
(разные курсоры, дискета, флэшка, лист, папка, стрелка, ножницы, карман, бинокль, ключ, лупа).
Буквеные шрифты тоже должны содержать всякие смайлики.
Но технология печати букв и элементов кнопок одна, поэтому можно при старте програмы, генерить
одну большую "шрифтовую" атлас-текстуру, где будут буквы, кнопки, иконки и смайлики.
Но если юзер захочет поменять лиш Стиль кнопок, то придётся пере-генерить эту текстуру.
Поэтому хочу генерить две отдельные большие атлас-текстуры - все шрифты букв и все шрифты кнопок.

Вероятно, нужно сделать, чтобы индексы от 1 до 31 (таких букв нет в шрифтах), автоматом переводились
на вариант взятия пикселей из текстуры кнопок - значит, смайлики будут частью атласа Кнопок.
В текстурных кардинах первого слоя, где буквы, ставим проектор на Пустое место.
Во втором слое, где элементы кнопок, ставим луч проектора на нужный смайлик (слайд смайлика).
Можно в первом слое под каждую букву разные подкладки делать.

//пропечатка букв и кнопок в три-мерность..
Допустим, что можно Создавать "кусты кнопок", вне-главного дерева.
Подобные кусты, всегда создаются "под текстуру", в которую мы будем рисовать кнопки куста.
Каждый кадр пропечатываем в спец-текстуру наш отдельный Куст и эта текстура заливает три-мерный
полигон или модэльку монитора (модельку пульта рядом с дверью или лифтом).
Максимально-принципиально правдиво, хотя буквы на модэльке могут искажаться.

#4
19:03, 6 июля 2011

slatazan
> void frz( char* fraza, ...
> void frz( std::string sfraza, ...

> fraza
> FRAZA!!!
НИНАДОТАКПЕЙСАТЪ!!

#5
19:06, 6 июля 2011

firefirefirefirefire
Ты не предложил своей версии. Твои восклицания пустые.

#6
19:08, 6 июля 2011

slatazan
Они имел в виду, что вместо "fraza" нужно писать "stroka".

#7
19:15, 6 июля 2011

slatazan
> void frz( char* _str, ...
> void frz( std::string _str, ...

#8
19:31, 6 июля 2011

firefirefirefirefire
Понятно. Я думал, что у тебя есть вариант вместо "frz".
Вроде-бы, название параметров внутри процедуры не важны.
Хотя, str универсальней выглядит.

dds
Он хитрый - только первые три буквы упомянул - можно воспринимать Строка, а можно Стринг. хе-хе.

// ---
Если есть у кого-то время подурачиться для пользы, то подскажите набор смайликов или супер-стандартных иконок.
Хочу подобрать тридцать один знак для индексов от 1 до 31 (в шрифты засовывать).

#9
19:49, 6 июля 2011

// В Юникоде есть символы для обозначения эмоций: ☹ (код 9785), ☺ (код 9786), ☻ (код 9787).
Я пока планирую без юни-кодов обойтись.
9785 может быть 1, и означать Грусть.
9786, как Весело.
9787, как Ярость.
И больше смайликов, вроде-бы, не нужно.

#10
20:12, 6 июля 2011

1 грусть
2 весело
3 ярость

- сундук == архив
- скрипичный ключ == ноты
- наушники (музыка) == ogg file
- шлем рыцаря == игра аля стратегия
- мото-шлем == что-то быстрое или рискованое
- футбольный мяч (черно-белый) == спорт
- пиковый туз == азартные игры
- сердечко == порно ?
- зонтик == погода ?
- корона == ?
- монетка == ?
- круглые часы == ?
- песочные часы == ?
- мышан компутерный (одна кнопка чёрная - можно зеркалить, либо два индекса занять)

комикс-бабэл с тремя точками == линк на цитату
замкнутая три-стрелка мусорного ре-юза
звезда (пяти)
шести-граник
снежинка
ёлочка - три пояса <<<
кленовый лист
цветок-ромашка сверху
письмо-конверт бумажный
дискета или флэшка
силуэт флага - какая-нибудь одна из версий, либо несколько близких кадров анимации волнения
золотой ключик (конечно, белый силуэт)
скважина для золотого ключика (вероятно, обрамление белое, а центр чёрный)

стрелки // одна-вправо, но 4 индекса тратим, а может-быть и восемь надо.

А вобше, не ясно. Возможно, все эти спец символы начинаются с индекса от 1 до 31,
а за собой имеют всегда "свои технические подробности" - у кого-то один байт, а у кого-то
и 2 байта - например, индекс стрелки может быть один, но за ним идёт Шорт, который указывает
угол поворота стрелки. Хотя, этот угол можно и байтом указать, если только чётные градусы.
Например, байт 45, будет означать 90 градусов. Байт 46, будет 92.

Будет лучше, если миксовать примитивные силуэты.
Силуэт фона и другим цветом силуэт знака.
Так стрелочки (и любые нормальные буквы) могут быть в круге и в квадрате.
// круг, квад, квад с круглыми углами, триуг, триуг с круглыми углами.

#11
20:39, 11 июля 2011

Пример проги "привет, мир"..
Здесь попытка нащупать системность и её использование.
Если есть какие-то явные ошибки у меня, то подскажите.
Также, хочется придумать набор публичных процедур с их аргументами, чтобы удобно было.

#include "pan_sys.h" // там есть упоминание (ifndef хикс) extern t_pan1 pan1;
    // Система панелей имеет в себе..
  // = имитация окна приложения и главного цыкла, если таковое требуется.
  // = сигналы от клавы-мышки.
  // = ввод текста и чисел через клавиатуру.
  // = батчинги дву-мерного рисования через OpenGL ( квады с кусками текстур).
  // = набор компонентов для формо-шлёпства из панелей.
  // = параметрическое (зажатое) скриптование панелей.

int test_exit = 0;

void test_sig( pan* p) // (pan* sender)
{
  if(! p) return;
  test_exit = 1;
}

void test_draw( pan* p)
{
  if(! p) return;

  int sh = 1; // номер_шрифта // это не номер текстуры.
  int fon = 1; // номер-пресет фонового оформления // в даном случае, полигон-прямуг.

  pan1.color( 0, 0.5, 0, 1); // RGBA // зелёный, не-прозрачный.
  pan1.print( p, fon);  // подобие Draw_quad( p->X(), p->Y(), p->H(), p->W() );

  pan1.color(); // белый, не-прозрачный. // задали цвет для последушего слова.
  pan1.print( p, sh, "привет, мир"); // по центру габаритов панельки "p".

  // Можно как-то оформить задание угла под которым принтовать (накапливать) квады.
  // Возможно, pan1.angle( 45 ); будет как постановка цвета перед print,
  // либо нужно сделать отдельные версии pan1.printug( 45,  p, sh, "привет, мир");

  // --- Ешё варианты пропечатки..
  // char* d2 = "rgb rgb rgb"; // совпадение колва букв не обязательно.
  // pan1.print2( p->X() +5, p->Y(), sh, "привет, мир", d2); // цвет каждой букве

  // pan1.colorb( 255, 255, 0, 255); // жолтый цвет через байты (от 0 до 255).
  // pan1.print3( p, sh, "привет, мир", "хинт для статус-бара");

  // pan1.cvb( 255, 255, 0, 255);  // пан1.цвб( ...);
  // pan1.pr2( p->X(5), p->Y(), sh, "привет"); // пан1.печ( ...);

  // pan1.pring1( 90, 180, p, sh, "привет, мир"); // напечатать аркой
}


  // если ты Новичок..
void main()
{
    // два названия процедур (либо ноли), икс, игрек, ширь, высь (дробь к экрану).
  pan1.add( 0, test_draw,  0.25, 0.25, 0.5, 0.5); // умолчанка от 7 часов.
  pan1.RUN_ME( 800, 600); // там будет попытка создать окно програмы. // ESC == Exit
}

  // если продвинутый Прогер..
#include <что_то_для_окна.h>  // реализация процедур.. create_ogl_window, WndProc
void main()
{
  int w = 800;
  int h = 600;
  if( ! create_ogl_window( w, h) ) return; // попытка создать окно програмы

  pan1._1_re_init( w, h, WndProc);
  pan1.add( test_sig, test_draw,  0.25, 0.25, 0.5, 0.5,  7); // от семи часов.

  for(;;) // main loop
  {
    if(test_exit) break;

    pan1._2_TrigUp(); // вызов test_sig
    pan1._3_UpdDraw(); // вызов test_draw
  }
}
#12
21:50, 11 июля 2011

В посте выше, нет назначения папки для парсинга-поиска текстур и прочего.
А значит, по дефолту, если текстур не найдено (даже если пытались), то нужно
запросить у опер-системы какой-то один шрифт (аля системный) и составить
из него атлас букв, а второй атлас програмно сгенерить по некому минимуму
(альфа-пустышка, квад, стрелочки).

Допустим, что вариант с ресурсами иницыируется так..

pan1._1_re_init( w, h, WndProc, "uni_files/pan1_res" );
И прога не должна повиснуть, если такой папки нет, хотя в лог-файл должна отметить.
И даже месагу выдать..
"Ресурсы для PAN1 не найдены (uni_files/pan1_res)." .
Вероятно, если такой папки вообше не было, то прога может её создать, и доп-создать
там файл "about.txt", в который залить текст, который есть в стрингах моудля pan_sys.cpp
Юзер может почитать и правильно наполнить папку.

Прошло более 4 лет
#13
17:22, 22 фев. 2016

Добрый день, уважаемые участники форума! Я неделю назад начал осваивать OpenGL, используя библиотеку glut. У меня проблема связана со вводом и выводом данных.
В консоли реализуется ввод следующим образом:
#include<iostream>
std::cout;
std::cin;

void main()
{
    int n;
  setlocale(LC_ALL, "Russian"); 
  cout<<"Сколько будет 25^2?";
  cin>>n;
  if(n!=625)
{
  cout<<"Вы ошиблись";
}
  if (n==625)
{
  cout<<"Верно";
}
}
Как мне реализовать аналогичные операции в glut?
Заранее благодарен.

#14
21:44, 22 фев. 2016

Evseev2324883

Заведи себе отдельную консоль (AllocConsole) и выводи текст в неё.

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.