Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

XDev + SDL
https://zx.oberon.org/forum/viewtopic.php?f=8&t=128
Страница 1 из 2

Автор:  slenkar [ 19 июл 2013, 05:11 ]
Заголовок сообщения:  XDev + SDL

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 */
 

Автор:  Zorko [ 22 июл 2013, 22:52 ]
Заголовок сообщения:  Re: XDev + SDL

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).

Автор:  slenkar [ 23 июл 2013, 00:29 ]
Заголовок сообщения:  Re: XDev + SDL

sounds cool :D

Автор:  Zorko [ 23 июл 2013, 18:31 ]
Заголовок сообщения:  Re: XDev + SDL

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. :)

Автор:  slenkar [ 24 июл 2013, 05:27 ]
Заголовок сообщения:  Re: XDev + SDL

yep good windows demos :)

Автор:  Zorko [ 24 июл 2013, 22:55 ]
Заголовок сообщения:  Re: XDev + SDL

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? :)

Автор:  slenkar [ 25 июл 2013, 00:21 ]
Заголовок сообщения:  Re: XDev + SDL

GrScr.Update sounds ok

can the pixel size be increased?

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

Автор:  slenkar [ 25 июл 2013, 04:29 ]
Заголовок сообщения:  Re: XDev + SDL

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

Автор:  Zorko [ 25 июл 2013, 11:46 ]
Заголовок сообщения:  Re: XDev + SDL

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. :)

Автор:  Zorko [ 25 июл 2013, 17:32 ]
Заголовок сообщения:  Re: XDev + SDL

Scalable graphic. :) Internal (virtual) resolution is 256x192 (like on Spectrum):

Вложения:
XDevSdl.png
XDevSdl.png [ 98.38 КБ | Просмотров: 43717 ]

Страница 1 из 2 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/