added imguizmo; subraster handling etc

This commit is contained in:
aap
2017-12-31 10:50:49 +01:00
parent 578c5f81fb
commit ddca04fdc2
20 changed files with 2170 additions and 45 deletions

View File

@@ -492,7 +492,7 @@ Camera::setFOV(float32 hfov, float32 ratio)
w = 1;
h = 1;
}
hfov = hfov*3.14159f/360.0f; // deg to rad
hfov = hfov*3.14159f/360.0f; // deg to rad and halved
float ar1 = 4.0/3.0;
float ar2 = w/h;

View File

@@ -375,6 +375,7 @@ Atomic::clone()
atomic->object.object.privateFlags |= WORLDBOUNDDIRTY;
if(this->geometry)
atomic->setGeometry(this->geometry, 0);
atomic->renderCB = this->renderCB;
atomic->pipeline = this->pipeline;
s_plglist.copy(atomic, this);
return atomic;

View File

@@ -350,7 +350,6 @@ int32 nativeRasterOffset;
void
rasterCreate(Raster *raster)
{
D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
static uint32 formatMap[] = {
0,
D3DFMT_A1R5G5B5,
@@ -375,20 +374,53 @@ rasterCreate(Raster *raster)
0,
0, 0, 0, 0, 0
};
if(raster->flags & 0x80)
return;
D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
uint32 format;
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
format = D3DFMT_P8;
natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER);
}else
format = formatMap[(raster->format >> 8) & 0xF];
natras->format = format;
natras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
natras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? levels : 1,
format);
int32 levels;
// Dummy to use as subraster
if(raster->width == 0 || raster->height == 0){
raster->flags |= Raster::DONTALLOCATE;
raster->stride = 0;
return;
}
switch(raster->type){
case Raster::NORMAL:
case Raster::TEXTURE:
if(raster->flags & Raster::DONTALLOCATE)
return;
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
format = D3DFMT_P8;
natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER);
}else
format = formatMap[(raster->format >> 8) & 0xF];
natras->format = format;
natras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
levels = Raster::calculateNumLevels(raster->width, raster->height);
natras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? levels : 1,
format);
break;
case Raster::ZBUFFER:
raster->flags |= Raster::DONTALLOCATE;
// TODO
break;
case Raster::CAMERA:
// TODO: get stuff from video mode
raster->flags |= Raster::DONTALLOCATE;
raster->originalWidth = raster->width;
raster->originalHeight = raster->height;
raster->stride = 0;
raster->pixels = nil;
break;
case Raster::CAMERATEXTURE:
raster->flags |= Raster::DONTALLOCATE;
// TODO
break;
}
}
uint8*
@@ -666,7 +698,7 @@ allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha)
ras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? numLevels : 1,
ras->format);
raster->flags &= ~0x80;
raster->flags &= ~Raster::DONTALLOCATE;
}
void

View File

@@ -418,6 +418,7 @@ beginUpdate(Camera *cam)
view[13] = inv.pos.y;
view[14] = inv.pos.z;
view[15] = 1.0f;
memcpy(&cam->devView, view, sizeof(RawMatrix));
d3ddevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)view);
// Projection Matrix
@@ -451,12 +452,22 @@ beginUpdate(Camera *cam)
proj[15] = 1.0f;
}
proj[14] = -cam->nearPlane*proj[10];
memcpy(&cam->devProj, proj, sizeof(RawMatrix));
d3ddevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)proj);
// TODO: figure out where this is really done
setRenderState(D3DRS_FOGSTART, *(uint32*)&cam->fogPlane);
setRenderState(D3DRS_FOGEND, *(uint32*)&cam->farPlane);
D3DVIEWPORT9 vp;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
vp.X = cam->frameBuffer->offsetX;
vp.Y = cam->frameBuffer->offsetY;
vp.Width = cam->frameBuffer->width;
vp.Height = cam->frameBuffer->height;
d3ddevice->SetViewport(&vp);
// TODO: figure out when to call this
d3ddevice->BeginScene();
}

View File

@@ -502,7 +502,6 @@ createTexture(int32 width, int32 height, int32 numlevels, uint32 format)
void
rasterCreate(Raster *raster)
{
XboxRaster *natras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
static uint32 formatMap[] = {
D3DFMT_UNKNOWN,
D3DFMT_A1R5G5B5,
@@ -533,20 +532,38 @@ rasterCreate(Raster *raster)
0,
0, 0, 0, 0, 0
};
if(raster->flags & 0x80)
return;
XboxRaster *natras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
uint32 format;
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
format = D3DFMT_P8;
natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER);
}else
format = formatMap[(raster->format >> 8) & 0xF];
natras->format = 0;
natras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
natras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? levels : 1,
format);
int32 levels;
// Dummy to use as subraster
if(raster->width == 0 || raster->height == 0){
raster->flags |= Raster::DONTALLOCATE;
raster->stride = 0;
return;
}
switch(raster->type){
case Raster::NORMAL:
case Raster::TEXTURE:
if(raster->flags & Raster::DONTALLOCATE)
return;
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
format = D3DFMT_P8;
natras->palette = (uint8*)rwNew(4*256, MEMDUR_EVENT | ID_DRIVER);
}else
format = formatMap[(raster->format >> 8) & 0xF];
natras->format = 0;
natras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
levels = Raster::calculateNumLevels(raster->width, raster->height);
natras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? levels : 1,
format);
default:
// unsupported
return;
}
}
uint8*
@@ -661,14 +678,14 @@ readNativeTexture(Stream *stream)
assert(unknownFlag == 0);
Raster *raster;
if(compression){
raster = Raster::create(width, height, depth, format | type | 0x80, PLATFORM_XBOX);
raster = Raster::create(width, height, depth, format | type | Raster::DONTALLOCATE, PLATFORM_XBOX);
XboxRaster *ras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
ras->format = compression;
ras->hasAlpha = hasAlpha;
ras->texture = createTexture(raster->width, raster->height,
raster->format & Raster::MIPMAP ? numLevels : 1,
ras->format);
raster->flags &= ~0x80;
raster->flags &= ~Raster::DONTALLOCATE;
}else
raster = Raster::create(width, height, depth, format | type, PLATFORM_XBOX);
XboxRaster *ras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);

View File

@@ -425,6 +425,7 @@ beginUpdate(Camera *cam)
view[13] = inv.pos.y;
view[14] = inv.pos.z;
view[15] = 1.0f;
memcpy(&cam->devView, &view, sizeof(RawMatrix));
setViewMatrix(view);
// Projection Matrix
@@ -459,6 +460,7 @@ beginUpdate(Camera *cam)
proj[14] = -2.0f*invz;
proj[15] = 1.0f;
}
memcpy(&cam->devProj, &proj, sizeof(RawMatrix));
setProjectionMatrix(proj);
if(uniformState.fogStart != cam->fogPlane){
@@ -490,7 +492,7 @@ openGLFW(EngineStartParams *startparams)
RWERROR((ERR_GENERAL, "glfwInit() failed"));
return 0;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_SAMPLES, 0);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

View File

@@ -23,10 +23,21 @@ int32 nativeRasterOffset;
void
rasterCreate(Raster *raster)
{
// Dummy to use as subraster
if(raster->width == 0 || raster->height == 0){
raster->flags |= Raster::DONTALLOCATE;
raster->stride = 0;
return;
}
switch(raster->type){
case Raster::CAMERA:
// TODO: set/check width, height, depth, format?
raster->flags |= Raster::DONTALLOCATE;
raster->originalWidth = raster->width;
raster->originalHeight = raster->height;
raster->stride = 0;
raster->pixels = nil;
break;
case Raster::ZBUFFER:
// TODO: set/check width, height, depth, format?

View File

@@ -80,6 +80,10 @@ struct InstanceDataHeader : rw::InstanceDataHeader
#ifdef RW_GL3
struct Shader;
extern Shader *simpleShader;
struct Im3DVertex
{
V3d position;

View File

@@ -3,7 +3,6 @@ namespace gl3 {
#ifdef RW_OPENGL
extern Shader *simpleShader;
extern uint32 im2DVbo, im2DIbo;
void openIm2D(void);
void closeIm2D(void);

View File

@@ -25,9 +25,8 @@ int32 findBlock(const char *name);
extern UniformRegistry uniformRegistry;
class Shader
struct Shader
{
public:
GLuint program;
// same number of elements as UniformRegistry::numUniforms
GLint *uniformLocations;

View File

@@ -34,7 +34,7 @@ void
main(void)
{
vec4 V = u_world * vec4(in_pos, 1.0);
vec4 cV = u_view * V;
vec4 cV = u_view * V;
gl_Position = u_proj * cV;
v_color = in_color;
v_tex0 = in_tex0;

View File

@@ -49,10 +49,8 @@ out float v_fog;
void
main(void)
{
vec3 lightdir = vec3(1.0, 1.0, -1.0);
vec4 V = u_world * vec4(in_pos, 1.0);
vec4 cV = u_view * V;
vec4 cV = u_view * V;
gl_Position = u_proj * cV;
vec3 N = mat3(u_world) * in_normal;
@@ -66,5 +64,5 @@ main(void)
v_tex0 = in_tex0;
v_fog = clamp((cV.z - u_fogEnd)/(u_fogStart - u_fogEnd), 0.0, 1.0);
v_fog = clamp((cV.z - u_fogEnd)/(u_fogStart - u_fogEnd), 0.0, 1.0);
}

View File

@@ -60,7 +60,7 @@ main(void)
mat4 world = u_world * m;
vec4 V = world * vec4(in_pos, 1.0);
vec4 cV = u_view * V;
vec4 cV = u_view * V;
gl_Position = u_proj * cV;
vec3 N = mat3(world) * in_normal;
@@ -74,5 +74,5 @@ main(void)
v_tex0 = in_tex0;
v_fog = clamp((cV.z - u_fogEnd)/(u_fogStart - u_fogEnd), 0.0, 1.0);
v_fog = clamp((cV.z - u_fogEnd)/(u_fogStart - u_fogEnd), 0.0, 1.0);
}

View File

@@ -179,11 +179,13 @@ struct Raster
int32 originalWidth;
int32 originalHeight;
int32 originalStride;
// TODO:
// parent raster and offset
// subraster
Raster *parent;
int32 offsetX, offsetY;
static Raster *create(int32 width, int32 height, int32 depth,
int32 format, int32 platform = 0);
void subRaster(Raster *parent, Rect *r);
void destroy(void);
static Raster *createFromImage(Image *image, int32 platform = 0);
Image *toImage(void);
@@ -583,6 +585,11 @@ struct Camera
Raster *frameBuffer;
Raster *zBuffer;
// Device dependant view and projection matrices
// optional
RawMatrix devView;
RawMatrix devProj;
// clump link handled by plugin in RW
Clump *clump;
LLLink inClump;

View File

@@ -456,6 +456,9 @@ Raster::create(int32 width, int32 height, int32 depth, int32 format, int32 platf
// TODO: pass arguments through to the driver and create the raster there
Raster *raster = (Raster*)rwMalloc(s_plglist.size, MEMDUR_EVENT); // TODO
assert(raster != nil);
raster->parent = raster;
raster->offsetX = 0;
raster->offsetY = 0;
raster->platform = platform ? platform : rw::platform;
raster->type = format & 0x7;
raster->flags = format & 0xF8;
@@ -471,6 +474,18 @@ Raster::create(int32 width, int32 height, int32 depth, int32 format, int32 platf
return raster;
}
void
Raster::subRaster(Raster *parent, Rect *r)
{
if((this->flags & DONTALLOCATE) == 0)
return;
this->width = r->w;
this->height = r->h;
this->offsetX += r->x;
this->offsetY += r->y;
this->parent = parent->parent;
}
void
Raster::destroy(void)
{