Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 21:43

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: XDev + SDL
СообщениеДобавлено: 19 июл 2013, 05:11 
Не в сети

Сообщения: 104
we could use SDL to draw dots to the screen?

In the SDL examples folder it has testdyngl which draws dots to the screen

the example can be changed to draw normal small dots easily

here is the code to draw some white dots

Код: "C"
 
/*
* Small SDL example to demonstrate dynamically loading
* OpenGL lib and functions
*
* (FYI it was supposed to look like snow in the wind or something...)
*
* Compile with :
* gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl -DHAVE_OPENGL
*
* You can specify a different OpenGL lib on the command line, i.e. :
* ./testdyngl /usr/X11R6/lib/libGL.so.1.2
* or
* ./testdyngl /usr/lib/libGL.so.1.0.4496
*
*/

 
#include <stdio.h>
#include <stdlib.h>
 
#include "SDL.h"
 
#ifdef __MACOS__
#define HAVE_OPENGL
#endif
 
#ifdef HAVE_OPENGL
 
#include "SDL_opengl.h"
 
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void quit(int rc)
{
SDL_Quit();
exit(rc);
}
 
void* get_funcaddr(const char* p)
{
void* f=SDL_GL_GetProcAddress(p);
if (f)
{
return f;
}
else
{
printf("Unable to get function pointer for %s\n",p);
quit(1);
}
return NULL;
}
 
typedef struct
{
void(APIENTRY*glBegin)(GLenum);
void(APIENTRY*glEnd)();
void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
void(APIENTRY*glClear)(GLbitfield);
void(APIENTRY*glDisable)(GLenum);
void(APIENTRY*glEnable)(GLenum);
void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
void(APIENTRY*glPointSize)(GLfloat);
void(APIENTRY*glHint)(GLenum,GLenum);
void(APIENTRY*glBlendFunc)(GLenum,GLenum);
void(APIENTRY*glMatrixMode)(GLenum);
void(APIENTRY*glLoadIdentity)();
void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
void(APIENTRY*glFogf)(GLenum,GLfloat);
}
glfuncs;
 
void init_glfuncs(glfuncs* f)
{
f->glBegin=get_funcaddr("glBegin");
f->glEnd=get_funcaddr("glEnd");
f->glVertex3f=get_funcaddr("glVertex3f");
f->glClearColor=get_funcaddr("glClearColor");
f->glClear=get_funcaddr("glClear");
f->glDisable=get_funcaddr("glDisable");
f->glEnable=get_funcaddr("glEnable");
f->glColor4ub=get_funcaddr("glColor4ub");
f->glPointSize=get_funcaddr("glPointSize");
f->glHint=get_funcaddr("glHint");
f->glBlendFunc=get_funcaddr("glBlendFunc");
f->glMatrixMode=get_funcaddr("glMatrixMode");
f->glLoadIdentity=get_funcaddr("glLoadIdentity");
f->glOrtho=get_funcaddr("glOrtho");
f->glRotatef=get_funcaddr("glRotatef");
f->glViewport=get_funcaddr("glViewport");
f->glFogf=get_funcaddr("glFogf");
}
 
#define NB_PIXELS 1000
 
int main(int argc,char *argv[])
{
glfuncs f;
int i;
SDL_Event event;
int done=0;
GLfloat pixels[NB_PIXELS*3];
const char *gl_library = NULL; /* Use the default GL library */
 
if (argv[1]) {
gl_library = argv[1];
}
 
if (SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("Unable to init SDL : %s\n",SDL_GetError());
return(1);
}
 
if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
{
printf("Unable to set GL attribute : %s\n",SDL_GetError());
quit(1);
}
 
if (SDL_GL_LoadLibrary(gl_library)<0)
{
printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
quit(1);
}
 
if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
{
printf("Unable to open video mode : %s\n",SDL_GetError());
quit(1);
}
 
/* Set the window manager title bar */
SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
 
init_glfuncs(&f);
 
for(i=0;i<NB_PIXELS;i++)
{
pixels[3*i]=rand()%250-125;
pixels[3*i+1]=rand()%250-125;
pixels[3*i+2]=rand()%250-125;
}
 
f.glViewport(0,0,640,480);
 
f.glMatrixMode(GL_PROJECTION);
f.glLoadIdentity();
f.glOrtho(0,640,480,0,-500,500);
 
f.glMatrixMode(GL_MODELVIEW);
f.glLoadIdentity();
 
f.glEnable(GL_DEPTH_TEST);
f.glDisable(GL_TEXTURE_2D);
f.glEnable(GL_BLEND);
f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
f.glClearColor(0.0f,0.0f,0.0f,0.0f);
f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
f.glEnable(GL_POINT_SMOOTH);
f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
f.glPointSize(1.0f);
f.glEnable(GL_FOG);
f.glFogf(GL_FOG_START,-500);
f.glFogf(GL_FOG_END,500);
f.glFogf(GL_FOG_DENSITY,0.005);
 
do
{
f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
//f.glRotatef(2.0,1.0,1.0,1.0);
//f.glRotatef(1.0,0.0,1.0,1.0);
 
f.glColor4ub(255,255,255,255);
f.glBegin(GL_POINTS);
f.glVertex3f(20,20,1);
f.glEnd();
f.glBegin(GL_POINTS);
 
f.glVertex3f(10,20,1);
f.glEnd();
 
f.glBegin(GL_POINTS);
f.glVertex3f(200,20,1);
f.glEnd();
f.glBegin(GL_POINTS);
f.glVertex3f(20,200,1);
f.glEnd();
 
f.glBegin(GL_POINTS);
f.glVertex3f(200,200,1);
f.glEnd();
// f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
f.glEnd();
SDL_GL_SwapBuffers();
 
while(SDL_PollEvent(&event))
{
if(event.type & SDL_KEYDOWN)
done=1;
}
 
SDL_Delay(20);
}
while(!done);
 
SDL_Quit();
return 0;
}
 
#else /* HAVE_OPENGL */
 
int main(int argc, char *argv[])
{
printf("No OpenGL support on this system\n");
return 1;
}
 
#endif /* HAVE_OPENGL */
 


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 22 июл 2013, 22:52 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
slenkar писал(а):
we could use SDL to draw dots to the screen?
Yes, sure. :) I made some steps to bind XDev with SDL, you can look at this new commit. Now only simple color dots output, and just only for Windows. In near future I have plans to implement GrTiles for SDL.

Now all binding code is written in Oberon, and it's a good example how to bind XDev/Ofront to an existing C library. Later I need to rewrite the code into C (to have "smart linking" feature).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 23 июл 2013, 00:29 
Не в сети

Сообщения: 104
sounds cool :D


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 23 июл 2013, 18:31 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Some scalable graphic and drawing mono tiles features was added. :)

I think we need to have possibility to write graphic software without dependence on screen resolution, therefore I've added actual (factual) and virtual coordinates. It allows to use virtual coords and stretch screen to any actual resolution. Just look at the samples. :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 24 июл 2013, 05:27 
Не в сети

Сообщения: 104
yep good windows demos :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 24 июл 2013, 22:55 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Line and Circle procedures was added, GrDemo was updated. :)

Drawing of actual pixels is enough optimal, but need to "update screen" manually - by calling GrScr.Update. At first I tried to update the screen in each call of PutPixel (by calling Sdl.UpdateRect), but it works very sloooooow.

Drawing of virtual (stretched) pixels is not so optimal (need to remove multiplies and divides by changing to array with pre-calculated data), but it works perfectly. This optimization is for the future.

What other ideas, mr. slenkar? :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 25 июл 2013, 00:21 
Не в сети

Сообщения: 104
GrScr.Update sounds ok

can the pixel size be increased?

or draw each pixel as a rect? (if they are bigger than one)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 25 июл 2013, 04:29 
Не в сети

Сообщения: 104
If you want speed opengl can draw dots at different sizes.
f.glPointSize(1.0f);
f.glPointSize(2.0f);
f.glPointSize(1.5f);
Any game that works on spectrum should work on pc without slowing down,
opengl should only be used for games that are too big for spectrum


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 25 июл 2013, 11:46 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
slenkar писал(а):
can the pixel size be increased?

or draw each pixel as a rect? (if they are bigger than one)
Yes, it can.

In this model the pixel size is specified in module GrConfig and may be any:
Код: "OBERON"
  1. VirtualWidth* = 256; (* Virtual Width, Height in pixels. *)
  2. VirtualHeight* = 192;
  3. ActualWidth* = VirtualWidth * 3; (* Actual Width, Height in pixels. *)
  4. ActualHeight* = VirtualHeight * 3;
Here the virtual pixel size is 3x3 of actual pixels. You can specify any actual and virtual coords, and you can have virtual pixels 2.5x2.5 of actual ( stretched as: OO OOO OO OOO ). Also you can specify virtual coords less than actual, in this case not all virtual pixels will be shown.

Try to change the coords and don't forget to compile/rebuild all modules that configured by GrConfig. :)

slenkar писал(а):
If you want speed opengl can draw dots at different sizes.
f.glPointSize(1.0f);
f.glPointSize(2.0f);
f.glPointSize(1.5f);
Any game that works on spectrum should work on pc without slowing down,
opengl should only be used for games that are too big for spectrum
I agree. If someone needs pure SDL or OpenGl, he must forget about compatibility with Spectrum. :)

Virtual model of coordinates adopted not for having possibility to draw a dot with any size (although it may be added in the future), and to rely on some coordinates for various screen resolutions. In the future we can add vector tiles/sprites and filters (like hq2x), and then the plan will be lit up even more new meaning.

Btw, I am quite satisfied with the speed of my module GrPixel. Simply said this to show that there is something to strive for, and that you did not find this an ideal. :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: XDev + SDL
СообщениеДобавлено: 25 июл 2013, 17:32 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Scalable graphic. :) Internal (virtual) resolution is 256x192 (like on Spectrum):


Вложения:
XDevSdl.png
XDevSdl.png [ 98.38 КБ | Просмотров: 22592 ]
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club