コード例 #1
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_general(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int c1, int c2, int c3, int c4, gs_scalar a1, gs_scalar a2, gs_scalar a3, gs_scalar a4)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar
    tbw = spr2d->width/spr2d->texbordxarray[usi], tbh = spr2d->height/spr2d->texbordyarray[usi],
    w = width*xscale, h = height*yscale;

    rot *= M_PI/180;
    const gs_scalar wcosrot = w*cos(rot), wsinrot = w*sin(rot);

    const gs_scalar ulcx = x + xscale * cos(M_PI+rot) + yscale * cos(M_PI/2+rot),
    ulcy = y - yscale * sin(M_PI+rot) - yscale * sin(M_PI/2+rot);

    const gs_scalar ulcx2 = ulcx + h * cos(3*M_PI/2 + rot),
    ulcy2 = ulcy - h * sin(3*M_PI/2 + rot);

    const gs_scalar data[4*8] = {
         ulcx,ulcy, left/tbw,top/tbh, __GETR(c1), __GETG(c1), __GETB(c1), a1,
         ulcx + wcosrot, ulcy - wsinrot, (left+width)/tbw,top/tbh, __GETR(c2), __GETG(c2), __GETB(c2), a2,
         ulcx2 + wcosrot, ulcy2 - wsinrot, (left+width)/tbw,(top+height)/tbh, __GETR(c3), __GETG(c3), __GETB(c3), a3,
         ulcx2,ulcy2, left/tbw,(top+height)/tbh, __GETR(c4), __GETG(c4), __GETB(c4), a4
    };
    plane2D_rotated(data);
}
コード例 #2
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_tiled(int spr, int subimg, gs_scalar x, gs_scalar y)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar tbx  = spr2d->texbordxarray[usi], tby  = spr2d->texbordyarray[usi],
    xoff = fmod(spr2d->xoffset+x,spr2d->width)-spr2d->width, yoff = fmod(spr2d->yoffset+y,spr2d->height)-spr2d->height;

    const int hortil = int(ceil((view_enabled ? int(view_xview[view_current] + view_wview[view_current]) : room_width) / (spr2d->width*tbx))) + 1,
    vertil = int(ceil((view_enabled ? int(view_yview[view_current] + view_hview[view_current]) : room_height) / (spr2d->height*tby))) + 1;

    gs_scalar xvert1 = xoff, xvert2 = xvert1 + spr2d->width, yvert1, yvert2;
    for (int i=0; i<hortil; i++)
    {
        yvert1 = yoff; yvert2 = yvert1 + spr2d->height;
        for (int c=0; c<vertil; c++)
        {
            const gs_scalar data[4*8] = {
                 xvert1, yvert1, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0,
                 xvert2, yvert1, tbx, 0.0, 1.0, 1.0, 1.0, 1.0,
                 xvert2, yvert2, tbx, tby, 1.0, 1.0, 1.0, 1.0,
                 xvert1, yvert2, 0.0, tby, 1.0, 1.0, 1.0, 1.0
            };
            plane2D_rotated(data);

            yvert1 = yvert2;
            yvert2 += spr2d->height;
        }
        xvert1 = xvert2;
        xvert2 += spr2d->width;
    }
}
コード例 #3
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_ext(int spr, int subimg, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int blend, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    rot *= M_PI/180;

    const gs_scalar w = spr2d->width*xscale, h = spr2d->height*yscale,
    tbx = spr2d->texbordxarray[usi], tby = spr2d->texbordyarray[usi],
    wsinrot = w*sin(rot), wcosrot = w*cos(rot);

    const gs_scalar ulcx = x - xscale * spr2d->xoffset * cos(rot) + yscale * spr2d->yoffset * cos(M_PI/2+rot),
    ulcy = y + xscale * spr2d->xoffset * sin(rot) - yscale * spr2d->yoffset * sin(M_PI/2+rot);
    const double mpr = 3*M_PI/2 + rot;
    const gs_scalar ulcx2 = ulcx + h * cos(mpr),
    ulcy2 = ulcy - h * sin(mpr);

    const gs_scalar r = __GETR(blend), g = __GETG(blend), b = __GETB(blend);
    const gs_scalar data[4*8] = {
         ulcx, ulcy, 0.0, 0.0, r, g, b, alpha,
         ulcx + wcosrot, ulcy - wsinrot, tbx, 0.0, r, g, b, alpha,
         ulcx2 + wcosrot, ulcy2 - wsinrot, tbx, tby, r, g, b, alpha,
         ulcx2, ulcy2, 0.0, tby, r, g, b, alpha
    };
    plane2D_rotated(data);
}
コード例 #4
0
void draw_sprite_ext(int spr, int subimg, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int color, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

	rot *= M_PI/180;

    const float
    w = spr2d->width*xscale, h = spr2d->height*yscale,
    tbx = spr2d->texbordxarray[usi], tby = spr2d->texbordyarray[usi],
    wsinrot = w*sin(rot), wcosrot = w*cos(rot);

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	float
		ulcx = x - xscale * spr2d->xoffset * cos(rot) + yscale * spr2d->yoffset * cos(M_PI/2+rot),
		ulcy = y + xscale * spr2d->xoffset * sin(rot) - yscale * spr2d->yoffset * sin(M_PI/2+rot);
	draw_vertex_texture_color(ulcx,ulcy, 0,0, color, alpha);
	draw_vertex_texture_color(ulcx + wcosrot, ulcy - wsinrot, tbx, 0, color, alpha);
	const double mpr = 3*M_PI/2 + rot;
    ulcx += h * cos(mpr);
    ulcy -= h * sin(mpr);
	draw_vertex_texture_color(ulcx,ulcy, 0,tby, color, alpha);
	draw_vertex_texture_color(ulcx + wcosrot, ulcy - wsinrot, tbx,tby, color, alpha);
	draw_primitive_end();
}
コード例 #5
0
void draw_sprite_tiled_ext(int spr, int subimg, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, int color, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

    const float
    tbx  = spr2d->texbordxarray[usi], tby  = spr2d->texbordyarray[usi],
    width_scaled = spr2d->width*xscale, height_scaled = spr2d->height*yscale,
    xoff = fmod(spr2d->xoffset*xscale+x,width_scaled)-width_scaled, yoff = fmod(spr2d->yoffset*yscale+y,height_scaled)-height_scaled;

    const int
    hortil = int(ceil((view_enabled ? int(view_xview[view_current] + view_wview[view_current]) : room_width) / (width_scaled*tbx))) + 1,
    vertil = int(ceil((view_enabled ? int(view_yview[view_current] + view_hview[view_current]) : room_height) / (height_scaled*tby))) + 1;

    float xvert1 = xoff, xvert2 = xvert1 + width_scaled, yvert1, yvert2;
    for (int i=0; i<hortil; i++)
    {
        yvert1 = yoff; yvert2 = yvert1 + height_scaled;
        for (int c=0; c<vertil; c++)
        {
			draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
			draw_vertex_texture_color(xvert1,yvert1,0,0,color,alpha);
			draw_vertex_texture_color(xvert2,yvert1,tbx,0,color,alpha);
			draw_vertex_texture_color(xvert1,yvert2,0,tby,color,alpha);
			draw_vertex_texture_color(xvert2,yvert2,tbx,tby,color,alpha);
			draw_primitive_end();
            yvert1 = yvert2;
            yvert2 += height_scaled;
       }
       xvert1 = xvert2;
       xvert2 += width_scaled;
    }
}
コード例 #6
0
void draw_sprite_general(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int c1, int c2, int c3, int c4, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

	const float
	  tbx = spr2d->texbordxarray[usi],  tby = spr2d->texbordyarray[usi],
	  tbw = spr2d->width/tbx, tbh = spr2d->height/tby,
	  w = width*xscale, h = height*yscale;

    rot *= M_PI/180;
    const float wcosrot = w*cos(rot), wsinrot = w*sin(rot);

    draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);

    float
    ulcx = x + xscale * cos(M_PI+rot) + yscale * cos(M_PI/2+rot),
    ulcy = y - yscale * sin(M_PI+rot) - yscale * sin(M_PI/2+rot);

	draw_vertex_texture_color(ulcx, ulcy, left/tbw, top/tbh, c1, alpha);
	draw_vertex_texture_color((ulcx + wcosrot), (ulcy - wsinrot), (left+width)/tbw, top/tbh, c2, alpha);

    ulcx += h * cos(3*M_PI/2 + rot);
    ulcy -= h * sin(3*M_PI/2 + rot);

	draw_vertex_texture_color((ulcx + wcosrot), (ulcy - wsinrot), (left+width)/tbw, (top+height)/tbh, c4, alpha);
	draw_vertex_texture_color(ulcx, ulcy, left/tbw, (top+height)/tbh, c3, alpha);

    draw_primitive_end();
}
コード例 #7
0
ファイル: GSsprite.cpp プロジェクト: Mikelle02/enigma-dev
void draw_sprite_tiled(int spr, int subimg, gs_scalar x, gs_scalar y, int color, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

    x = ((spr2d->xoffset+x)<0?0:spr2d->width)-fmod(spr2d->xoffset+x,spr2d->width);
    y = ((spr2d->yoffset+y)<0?0:spr2d->height)-fmod(spr2d->yoffset+y,spr2d->height);

    const gs_scalar tbx  = spr2d->texbordxarray[usi], tby  = spr2d->texbordyarray[usi];

    const int
    hortil = int(ceil((view_enabled ? (gs_scalar)(view_xview[view_current] + view_wview[view_current]) : (gs_scalar)room_width) / ((gs_scalar)spr2d->width))) + 1,
    vertil = int(ceil((view_enabled ? (gs_scalar)(view_yview[view_current] + view_hview[view_current]) : (gs_scalar)room_height) / ((gs_scalar)spr2d->height))) + 1;

    gs_scalar xvert1 = -x, xvert2 = xvert1 + spr2d->width, yvert1, yvert2;
    for (int i=0; i<hortil; ++i)
    {
        yvert1 = -y; yvert2 = yvert1 + spr2d->height;
        for (int c=0; c<vertil; ++c)
        {
			draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
			draw_vertex_texture_color(xvert1,yvert1,0,0,color,alpha);
			draw_vertex_texture_color(xvert2,yvert1,tbx,0,color,alpha);
			draw_vertex_texture_color(xvert1,yvert2,0,tby,color,alpha);
			draw_vertex_texture_color(xvert2,yvert2,tbx,tby,color,alpha);
			draw_primitive_end();
            yvert1 = yvert2;
            yvert2 += spr2d->height;
        }
        xvert1 = xvert2;
        xvert2 += spr2d->width;
    }
}
コード例 #8
0
void draw_sprite_pos(int spr, int subimg, gs_scalar x1, gs_scalar y1, gs_scalar x2, gs_scalar y2, gs_scalar x3, gs_scalar y3, gs_scalar x4, gs_scalar y4, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

    const float tbx = spr2d->texbordxarray[usi], tby = spr2d->texbordyarray[usi];

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(x1,y1,0,0,draw_get_color(),alpha);
	draw_vertex_texture_color(x2,y1,tbx,0,draw_get_color(),alpha);
	draw_vertex_texture_color(x1,y2,0,tby,draw_get_color(),alpha);
	draw_vertex_texture_color(x2,y2,tbx,tby,draw_get_color(),alpha);
	draw_primitive_end();
}
コード例 #9
0
void draw_sprite(int spr,int subimg, gs_scalar x, gs_scalar y, int color, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

	const float tbx = spr2d->texbordxarray[usi], tby = spr2d->texbordyarray[usi],
			xvert1 = x-spr2d->xoffset, xvert2 = xvert1 + spr2d->width,
			yvert1 = y-spr2d->yoffset, yvert2 = yvert1 + spr2d->height;

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(xvert1,yvert1,0,0,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbx,0,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2, 0,tby,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2, tbx,tby,color,alpha);
	draw_primitive_end();
}
コード例 #10
0
void draw_sprite_part(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, int color, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

	float tbw = spr2d->width/(float)spr2d->texbordxarray[usi], tbh = spr2d->height/(float)spr2d->texbordyarray[usi],
	  tbx1 = left/tbw, tbx2 = tbx1 + width/tbw,
	  tby1 = top/tbh, tby2 = tby1 + height/tbh;

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(x,y,tbx1,tby1,color,alpha);
	draw_vertex_texture_color(x+width,y,tbx2,tby1,color,alpha);
	draw_vertex_texture_color(x,y+height,tbx1,tby2,color,alpha);
	draw_vertex_texture_color(x+width,y+height,tbx2,tby2,color,alpha);
	draw_primitive_end();
}
コード例 #11
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_stretched(int spr, int subimg, gs_scalar x, gs_scalar y, gs_scalar width, gs_scalar height)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar tbx = spr2d->texbordxarray[usi], tby = spr2d->texbordyarray[usi],
                xvert1 = x-spr2d->xoffset, xvert2 = xvert1 + width,
                yvert1 = y-spr2d->yoffset, yvert2 = yvert1 + height;

    const gs_scalar data[4*8] = {
         xvert1, yvert1, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0,
         xvert2, yvert1, tbx, 0.0, 1.0, 1.0, 1.0, 1.0,
         xvert2, yvert2, tbx, tby, 1.0, 1.0, 1.0, 1.0,
         xvert1, yvert2, 0.0, tby, 1.0, 1.0, 1.0, 1.0
    };
    plane2D_rotated(data);
}
コード例 #12
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_part(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar tbw = spr2d->width/(float)spr2d->texbordxarray[usi], tbh = spr2d->height/(float)spr2d->texbordyarray[usi],
          tbx1 = left/tbw, tbx2 = tbx1 + width/tbw,
          tby1 = top/tbh, tby2 = tby1 + height/tbh;

    const gs_scalar data[4*8] = {
         x, y, tbx1, tby1, 1.0, 1.0, 1.0, 1.0,
         x+width, y, tbx2, tby1, 1.0, 1.0, 1.0, 1.0,
         x+width, y+height, tbx2, tby2, 1.0, 1.0, 1.0, 1.0,
         x, y+height, tbx1, tby2, 1.0, 1.0, 1.0, 1.0
    };
    plane2D_rotated(data);
}
コード例 #13
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_part_ext(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, int blend, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar tbw = spr2d->width/(float)spr2d->texbordxarray[usi], tbh = spr2d->height/(float)spr2d->texbordyarray[usi],
          xvert1 = x, xvert2 = xvert1 + width*xscale,
          yvert1 = y, yvert2 = yvert1 + height*yscale,
          tbx1 = left/tbw, tbx2 = tbx1 + width/tbw,
          tby1 = top/tbh, tby2 = tby1 + height/tbh;

    const gs_scalar r = __GETR(blend), g = __GETG(blend), b = __GETB(blend);
    const gs_scalar data[4*8] = {
         xvert1,yvert1, tbx1,tby1, r, g, b, alpha,
         xvert2,yvert1, tbx2,tby1, r, g, b, alpha,
         xvert2,yvert2, tbx2,tby2, r, g, b, alpha,
         xvert1,yvert2, tbx1,tby2, r, g, b, alpha
    };
    plane2D_rotated(data);
}
コード例 #14
0
ファイル: GL3sprite.cpp プロジェクト: Mushsauce/enigma-dev
void draw_sprite_tiled_ext(int spr, int subimg, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, int blend, gs_scalar alpha)
{
    get_spritev(spr2d,spr);
    const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;
    texture_use(GmTextures[spr2d->texturearray[usi]]->gltex);

    const gs_scalar
    tbx  = spr2d->texbordxarray[usi], tby  = spr2d->texbordyarray[usi],
    width_scaled = spr2d->width*xscale, height_scaled = spr2d->height*yscale,
    xoff = fmod(spr2d->xoffset*xscale+x,width_scaled)-width_scaled, yoff = fmod(spr2d->yoffset*yscale+y,height_scaled)-height_scaled;


    const int
    hortil = int(ceil((view_enabled ? int(view_xview[view_current] + view_wview[view_current]) : room_width) / (width_scaled*tbx))) + 1,
    vertil = int(ceil((view_enabled ? int(view_yview[view_current] + view_hview[view_current]) : room_height) / (height_scaled*tby))) + 1;

    gs_scalar xvert1 = xoff, xvert2 = xvert1 + width_scaled, yvert1, yvert2;
    const gs_scalar r = __GETR(blend), g = __GETG(blend), b = __GETB(blend);
    for (int i=0; i<hortil; i++)
    {
        yvert1 = yoff; yvert2 = yvert1 + height_scaled;
        for (int c=0; c<vertil; c++)
        {
            const gs_scalar data[4*8] = {
                 xvert1, yvert1, 0.0, 0.0, r, g, b, alpha,
                 xvert2, yvert1, tbx, 0.0, r, g, b, alpha,
                 xvert2, yvert2, tbx, tby, r, g, b, alpha,
                 xvert1, yvert2, 0.0, tby, r, g, b, alpha
            };
            plane2D_rotated(data);
            yvert1 = yvert2;
            yvert2 += height_scaled;
       }
       xvert1 = xvert2;
       xvert2 += width_scaled;
    }
}
コード例 #15
0
ファイル: GSsprite.cpp プロジェクト: Mikelle02/enigma-dev
//Draw padded
void draw_sprite_padded(int spr, int subimg, gs_scalar left, gs_scalar top, gs_scalar right, gs_scalar bottom, gs_scalar x1, gs_scalar y1, gs_scalar x2, gs_scalar y2, int color, gs_scalar alpha)
{
  get_spritev(spr2d,spr);
  const int usi = subimg >= 0 ? (subimg % spr2d->subcount) : int(((enigma::object_graphics*)enigma::instance_event_iterator->inst)->image_index) % spr2d->subcount;

	//Order x1,y1,x2,y2 correctly
	if (x1>x2) {gs_scalar tx = x2; x2 = x1, x1 = tx;}
	if (y1>y2) {gs_scalar ty = y2; y2 = y1, y1 = ty;}

	//Minimum w = left+right and minimum h = top+bottom
	gs_scalar w = x2-x1, h = y2-y1;
	if (w<left+right) x2 = x1+left+right, w = x2-x1;
	if (h<top+bottom) y2 = y1+top+bottom, h = y2-y1;

	const gs_scalar midw = w-left-right, midh = h-top-bottom;
	const gs_scalar midtw = spr2d->width-left-right, midth = spr2d->height-bottom-top;
	const gs_scalar tbw = spr2d->width/(gs_scalar)spr2d->texbordxarray[usi], tbh = spr2d->height/(gs_scalar)spr2d->texbordyarray[usi];
	const gs_scalar tbl = left/tbw, tbt = top/tbh, tbr = right/tbw, tbb = bottom/tbh, tbmw = midtw/tbw, tbmh = midth/tbh;

  //Draw top-left corner
	gs_scalar xvert1 = x1, xvert2 = xvert1 + left,
	          yvert1 = y1, yvert2 = yvert1 + top;

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(xvert1,yvert1,0.0,0.0,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl,0.0,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,0.0,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl,tbt,color,alpha);

	//Draw left side
	xvert1 = x1, xvert2 = xvert1 + left,
	yvert1 = y1 + top, yvert2 = yvert1 + midh;

	draw_vertex_texture_color(xvert1,yvert1,0.0,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl,tbt,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,0.0,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl,tbt+tbmh,color,alpha);

	//Draw bottom-left corner
	xvert1 = x1, xvert2 = xvert1 + left,
	yvert1 = y1 + top + midh, yvert2 = yvert1 + bottom;

	draw_vertex_texture_color(xvert1,yvert1,0.0,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,0.0,tbt+tbmh+tbb,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl,tbt+tbmh+tbb,color,alpha);
	draw_primitive_end();

	//Draw top
  xvert1 = x1 + left, xvert2 = xvert1 + midw,
  yvert1 = y1, yvert2 = yvert1 + top;

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(xvert1,yvert1,tbl,0.0,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw,0.0,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw,tbt,color,alpha);

  //Draw middle
  xvert1 = x1 + left, xvert2 = xvert1 + midw,
  yvert1 = y1 + top, yvert2 = yvert1 + midh;

	draw_vertex_texture_color(xvert1,yvert1,tbl,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw,tbt,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw,tbt+tbmh,color,alpha);

	//Draw bottom
  xvert1 = x1 + left, xvert2 = xvert1 + midw,
  yvert1 = y1 + midh + top, yvert2 = yvert1 + bottom;

	draw_vertex_texture_color(xvert1,yvert1,tbl,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl,tbt+tbmh+tbb,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw,tbt+tbmh+tbb,color,alpha);
	draw_primitive_end();

	//Draw top-right corner
  xvert1 = x1 + midw + left, xvert2 = xvert1 + right,
  yvert1 = y1, yvert2 = yvert1 + top;

	draw_primitive_begin_texture(pr_trianglestrip, spr2d->texturearray[usi]);
	draw_vertex_texture_color(xvert1,yvert1,tbl+tbmw,0.0,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw+tbr,0.0,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl+tbmw,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw+tbr,tbt,color,alpha);

	//Draw right side
	xvert1 = x1 + midw + left, xvert2 = xvert1 + right,
	yvert1 = y1 + top, yvert2 = yvert1 + midh;

	draw_vertex_texture_color(xvert1,yvert1,tbl+tbmw,tbt,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw+tbr,tbt,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl+tbmw,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw+tbr,tbt+tbmh,color,alpha);

	//Draw bottom-right corner
    xvert1 = x1 + midw + left, xvert2 = xvert1 + right,
    yvert1 = y1 + top + midh, yvert2 = yvert1 + bottom;

	draw_vertex_texture_color(xvert1,yvert1,tbl+tbmw,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert2,yvert1,tbl+tbmw+tbr,tbt+tbmh,color,alpha);
	draw_vertex_texture_color(xvert1,yvert2,tbl+tbmw,tbt+tbmh+tbb,color,alpha);
	draw_vertex_texture_color(xvert2,yvert2,tbl+tbmw+tbr,tbt+tbmh+tbb,color,alpha);
	draw_primitive_end();
}