Files
LayaNative2.0/Conch/source/conch/Test/Cases/testRender.cpp
T
2020-11-11 16:17:13 +08:00

1084 lines
39 KiB
C++

#ifdef _TEST_
#include "../JCTestManager.h"
#include <3DRS/JCRenderer.h>
#include <3DRS/JCRenderGroupData.h>
#include <3DRS/JCGpuProgram.h>
#include <buffer/JCBuffer.h>
#include <fileSystem/JCFilesystem.h>
#include <imageLib/JCImageRW.h>
#include <3DRS/JCMaterial.h>
#include <3DRS/JCConchMesh.h>
#include <3DRS/JCVertexBuffer.h>
#include "../../WindowsEnv/winWindows.h"
#include "../../WindowsEnv/gles.h"
#include <misc/JCWorkerThread.h>
#include <JCIGLRender.h>
#include <3DRS/JCMeshBuilder.h>
#include <gl/GL.h>
#include <util/Log.h>
#include <Image/JCImage.h>
using namespace laya;
namespace laya {
extern JCWorkerThread* g_DecThread;
}
/*
0.基本函数的对象检查
1.vertexbuffer
1.rendersys正常
1.能渲染二维
1.
2.多层uv的情况
2.能渲染三维
1.自己创建的模型
2.加载模型文件
2.资源缩减
3.能渲染单张图片
1.原始大小渲染
2.节省模式渲染
1.image缩小
2.贴图缩小
4.能渲染大图集
*/
namespace renderTest {
const char* _2dvs = R"(
attribute vec2 position;
attribute vec2 texcoord;
attribute vec4 color;
uniform vec4 g_DevInfo;
uniform mat4 g_OffsetMatrix;
varying vec2 texCoord;
varying vec4 oColor;
void main()
{
float cx = (position.x*2.0/g_DevInfo.x)-1.0;
float cy = -(position.y*2.0/g_DevInfo.y)+1.0;
gl_Position = vec4(cx, cy, 0.5, 1.0);
texCoord.xy = texcoord;
oColor = color;
}
)";
const char* _2dps = R"(
#define PI 3.141593
precision mediump float;
uniform sampler2D g_Tex0;
uniform vec4 u_color; //rgb,strength
uniform vec4 u_blurInfo; //blurw,blurh,texw,texh
uniform vec4 u_blur_off; //blurx,blury,offx,offy
uniform float g_Alpha;
uniform vec4 g_TexRange; //r,g,b表示rgb的亮度调整,w表示饱和度的调整。w从-1到1(0到1?).
//fillimage的时候是纹理范围
uniform vec4 g_Filter; //x alpha , y 1-饱和度 z 饱和度/3
varying vec2 texCoord;
varying vec4 oColor; //顶点输出的颜色
vec2 getFillImgTexcoord(){
vec2 newTexCoord;
newTexCoord.x = mod((texCoord.x-g_TexRange.x),g_TexRange.y)+g_TexRange.x;
newTexCoord.y = mod((texCoord.y-g_TexRange.z),g_TexRange.w)+g_TexRange.z;
return newTexCoord;
}
float sigma=u_blurInfo.x/3.0;//3σ以外影响很小。即当σ=1的时候,半径为3
float sig2 = sigma*sigma;
float _2sig2 = 2.0*sig2;
float gauss1 = 1.0/(2.0*PI*sig2);
float getGaussian(float x, float y){
return gauss1*exp(-(x*x+y*y)/_2sig2);
}
vec4 blur(vec2 texcoord){
const float blurw = 9.0;
vec4 vec4Color = vec4(0.0,0.0,0.0,0.0);
vec2 halfsz=vec2(blurw,blurw)/2.0/u_blurInfo.zw;
vec2 startpos=texcoord-halfsz-u_blur_off.zw;
vec2 ctexcoord = startpos;
vec2 step = 1.0/u_blurInfo.zw; //每个像素
for(float y = 0.0;y<=blurw; ++y){
ctexcoord.x=startpos.x;
for(float x = 0.0;x<=blurw; ++x){
//TODO 纹理坐标的固定偏移应该在vs中处理
vec4Color += texture2D(g_Tex0, ctexcoord)*getGaussian(x-blurw/2.0,y-blurw/2.0);
ctexcoord.x+=step.x;
}
ctexcoord.y+=step.y;
}
return vec4Color;
}
vec4 filter(vec4 color){
float avg = dot(color.xyz, g_Filter.zzz);
color.rgb = (avg + g_TexRange.xyz*color.rgb*g_Filter.y );
color.a *= g_Filter.x;
return color;
}
//TODO 测试这样写效率是不是降低了
void main(){
vec2 texc = texCoord;
#ifdef FILL_IMG_ADJ_TEXC
texc = getFillImgTexcoord();
#endif
#ifdef TYPE_FILLCOLOR
vec4 color = oColor;
#elif defined(TYPE_TEXTURE)
vec4 color =texture2D(g_Tex0, texc);
#elif defined(TYPE_GLOW)
vec4 color = blur(texc);
color = vec4(u_color.rgb,color.a*u_color.w);
#elif defined(TYPE_BLUR)
vec4 color = blur(texc);
#endif
#ifdef USE_FILTER
color = filter(color);
#endif
gl_FragColor=color;
#ifdef USE_G_ALPHA
gl_FragColor.w*=g_Alpha;
#endif
}
)";
/*
class CRender1{
public:
JCGpuProgram* m_pTestShader;
mesh* m_pTestMesh;
Material* m_pTestMaterial;
RenderGroupData m_RenderGroupData;
ShaderLinkInfo m_ShaderInfo;
float m_fV;
void setup(){
m_fV = 0;
m_pTestShader = new gpuProgram();
buffer bufvs;
char* pVSSrc="attribute vec3 g_Position;\
attribute vec2 g_TexCoord0;\
varying vec2 texCoord;\
void main(){\
gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\
texCoord=g_TexCoord0;\
}";
char* pPSSrc="precision mediump float;"
"uniform sampler2D g_Tex0;"
"varying vec2 texCoord;"
"varying vec4 vertColor;"
"void main(){"
" gl_FragColor=texture2D(g_Tex0, texCoord);\n\
}";
m_pTestShader->setSrc(pVSSrc, pPSSrc);
int nProgram = m_pTestShader->compile();
//load jpeg
buffer buf;
readFileSync("d:/temp/gameicon.png",buf);
BitmapData bmp;
bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp);
LayaTexture* pLayaTexture = new LayaTexture(NULL,NULL, LayaTexture::TEXTURE_TYPE_NORMAL);
pLayaTexture->setTextureSize(bmp.m_nWidth, bmp.m_nHeight);
pLayaTexture->copyImageToTexture(&bmp,0,1,1);
m_pTestMaterial = new Material();
m_pTestMaterial->m_fAlpha = 1.0f;
m_pTestMaterial->setShaderProgram((Shader*)m_pTestShader);
m_pTestMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL;
m_pTestMaterial->m_fColor[0]=1;
m_pTestMaterial->m_fColor[1]=1;
m_pTestMaterial->m_fColor[2]=0;
m_pTestMaterial->m_fColor[3]=0;
m_pTestMaterial->m_pTexture[0] = pLayaTexture;
m_pTestMesh = new mesh();
//VB
m_pTestMesh->createVB(20,4);
JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0);
pMemBuffer->clear();
vertex v[4]={{-0.5f,0.5f,0.5f,0,0}, {0.5f,0.5f,0.5f,1,0},
{0.5f,-0.5f,0.5f,1,1},{-0.5f,-0.5f,0.5f,0,1}};
pMemBuffer->append(v,sizeof(v));
//IB
m_pTestMesh->createIB(GL_UNSIGNED_SHORT, 6);
pMemBuffer = m_pTestMesh->getIB()->getMemBuffer(0);
pMemBuffer->clear();
unsigned short idx[6]={0,1,2,2,0,3};
pMemBuffer->append(idx,sizeof(idx));
VertexDesc* pVertDesc = m_pTestMesh->m_pVertDesc = new VertexDesc();
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0));
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0,GL_FLOAT_VEC2,3*4,0));
namedData* pDefMaterialDesc = getDefaultMaterialNamedData();
renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, &pDefMaterialDesc,1);
m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo;
m_RenderGroupData.m_pMaterial = m_pTestMaterial;
m_RenderGroupData.m_nBegin=0;
m_RenderGroupData.m_nEnd=6;
//m_pTestMesh->m_pShaderInfo = &sinfo;
}
*/
/*
void runLoop(){
glClearColor(0,0.2f,0,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//TEST
JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0);
float* pVertex = (float*)pMemBuffer->getBuf();
pVertex[0] = sinf(m_fV);
m_fV+=0.1f;
pMemBuffer->setChangedFlag(true);
m_pTestMaterial->m_fColor[2]=pVertex[0];
renderer::renderMesh(m_pTestMesh, &m_RenderGroupData, (char**)&m_pTestMaterial, 1);
}
};
void _1_1_1_test(){
class TestRender:public IGLRender{
public:
virtual void onGLReady(){
r.setup();
}
virtual void renderFrame(long,bool){
r.runLoop();
GLvoid* pix=new char[100];
glReadPixels(0,0,1,1,GL_RGBA,GL_UNSIGNED_BYTE,pix);
int a=0;
delete [] pix;
}
virtual void onGLDestory(){
int a=0;
}
virtual void invalidGLRes(){}
virtual void freeGLRes() {}
void setProcess(ProcessInterface*) {}
CRender1 r;
};
GLEnvThread gl;
TestRender render;
gl.init(&render,800,600);
winWindows::handleMessage(NULL);
}
void _1_1_2_test(){
class TestRender:public IGLRender{
public:
virtual void onGLReady(){
//编译shader
m_pTestShader = new gpuProgram();
char* pVSSrc="attribute vec3 g_Position;\
attribute vec2 g_TexCoord0;\
attribute vec2 g_TexCoord1;\
varying vec2 tex0;\
varying vec2 tex1;\
void main(){\
gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\
tex0=g_TexCoord0;\
tex1=g_TexCoord0;\
}";
char* pPSSrc="precision mediump float;"
"uniform sampler2D g_Tex0;"
"uniform sampler2D g_Tex1;"
"varying vec2 tex0,tex1;"
"varying vec4 vertColor;"
"void main(){\
vec4 col1 = texture2D(g_Tex1,tex0);\n\
gl_FragColor=col1+texture2D(g_Tex0, tex0);\n\
}";
m_pTestShader->setSrc(pVSSrc, pPSSrc);
int nProgram = m_pTestShader->compile();
//创建mesh
m_pTestMesh = new mesh();
//VB
m_pTestMesh->createVB(20,4);
JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0);
pMemBuffer->clear();
vertex v[4]={{-0.5f,0.5f,0.5f,0,0}, {0.5f,0.5f,0.5f,1,0},
{0.5f,-0.5f,0.5f,1,1},{-0.5f,-0.5f,0.5f,0,1}};
pMemBuffer->append(v,sizeof(v));
//IB
m_pTestMesh->createIB(GL_UNSIGNED_SHORT, 6);
pMemBuffer = m_pTestMesh->getIB()->getMemBuffer(0);
pMemBuffer->clear();
unsigned short idx[6]={0,1,2,2,0,3};
pMemBuffer->append(idx,sizeof(idx));
//Texture
buffer buf;
BitmapData bmp;
readFileSync("d:/temp/gameicon.png",buf);
bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp);
LayaTexture* pTex1=new LayaTexture(NULL,NULL,100,100,0);
pTex1->copyImageToTexture(&bmp,0,1,1);
readFileSync("d:/temp/test.jpg",buf);
b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp);
//createGridBmp(bmp,800,800,20);
LayaTexture* pTex2=new LayaTexture(NULL,NULL,100,100,0);
pTex2->copyImageToTexture(&bmp,0,1,1);
//创建材质
m_pTestMaterial = new Material();
m_pTestMaterial->m_fAlpha = 1.0f;
m_pTestMaterial->setShaderProgram((Shader*)m_pTestShader);
m_pTestMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL;
m_pTestMaterial->m_fColor[0]=1;
m_pTestMaterial->m_pTexture[0] = pTex1;
m_pTestMaterial->m_pTexture[1] = pTex2;
VertexDesc* pVertDesc = m_pTestMesh->m_pVertDesc = new VertexDesc();
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0));
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0,GL_FLOAT_VEC2,3*4,0));
namedData* pDefMaterialDesc = getDefaultMaterialNamedData();
renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, &pDefMaterialDesc,1);
m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo;
m_RenderGroupData.m_pMaterial = m_pTestMaterial;
m_RenderGroupData.m_nBegin=0;
m_RenderGroupData.m_nEnd=6;
}
virtual void renderFrame(long,bool){
glClearColor(0.4f,0.2f,0.2f,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
renderer::renderMesh(m_pTestMesh, &m_RenderGroupData, (char**)&m_pTestMaterial, 1);
}
virtual void invalidGLRes(){}
virtual void freeGLRes() {}
virtual void setProcess(ProcessInterface* p_pCurProcess) {}
protected:
gpuProgram* m_pTestShader;
mesh* m_pTestMesh;
ShaderLinkInfo m_ShaderInfo;
RenderGroupData m_RenderGroupData;
Material* m_pTestMaterial;
};
TestRender render;
GLEnvThread gl;
gl.init(&render,600,600);
winWindows::handleMessage(NULL);
}
*/
/*
void _1_2_1_test3d(){
struct vertex{
float x,y,z;
float u,v;
float nx,ny,nz;
//unsigned int color;
};
struct rundata{
Matrix44 matworld;
Matrix44 matpers;
};
class render3d_1:public IGLRender{
public:
void onGLReady(){
//shader
m_pShader = new gpuProgram();
char* pVSSrc="precision mediump float; \
attribute vec3 g_Position;\
attribute vec2 g_TexCoord0;\
attribute vec3 g_Normal; \
attribute float g_alpha; \
uniform mat4 g_worldmatrix; \
uniform mat4 g_persmat; \
varying vec2 tex0;\
varying vec3 norm; \
varying float alpha; \
void main(){\
vec4 vpos = vec4(g_Position.xyz,1.0); \
gl_Position = g_persmat*g_worldmatrix*vpos; \
norm = g_Normal; \
tex0=g_TexCoord0;\
alpha = g_alpha; \
}";
char* pPSSrc="precision mediump float;"
"uniform sampler2D g_Tex0;"
"uniform sampler2D g_Tex1;"
"varying vec2 tex0,tex1;"
"varying vec3 norm;"
"varying vec4 vertColor;"
"varying float alpha;"
"void main(){\
vec4 col1 = texture2D(g_Tex1,tex0);\n\
gl_FragColor=vec4(col1.xyz, 1.0);\
}";
m_pShader->setSrc(pVSSrc, pPSSrc);
int nProgram = m_pShader->compile();
int nVertNum=24;
//TODO 需要测试直接创建多流的情况
JCMeshBuilder::Geom geo;
JCMeshBuilder::BuildBoxGeo(true,.8f, .8f, .8f,geo);
VertexDesc* pVertDesc = m_mesh.m_pVertDesc = new VertexDesc();
//0
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0));
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0, GL_FLOAT_VEC2,3*4,0));
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc("g_Normal", GL_FLOAT_VEC3,5*4,0));
//1
pVertDesc->m_VertDescs.push_back(VertexDesc::Desc("g_alpha", GL_FLOAT,sizeof(vertex)*nVertNum,1));
int idxnum=36;
m_mesh.createVB(sizeof(vertex),nVertNum);
m_mesh.createIB(GL_UNSIGNED_SHORT,idxnum);
m_mesh.addStream(sizeof(float)); //alpha
JCMemClass* pgeo = m_mesh.getVBMem(0);
JCMemClass* palpha = m_mesh.getVBMem(1);
JCMemClass* pidx = m_mesh.getIB()->getMemBuffer(0);
//通知一下实际大小。
pgeo->appendEmpty(sizeof(vertex)*nVertNum);
palpha->appendEmpty(nVertNum*sizeof(float));
vertex* pS1 = (vertex*)pgeo->getBuf();
for( int i=0; i<nVertNum; i++){
pS1->x = *(geo.pVertex)++;
pS1->y = *geo.pVertex++;
pS1->z = *geo.pVertex++;
pS1->u = *geo.pUV++;
pS1->v = *geo.pUV++;
pS1->nx = *geo.pNorm++;
pS1->ny = *geo.pNorm++;
pS1->nz = *geo.pNorm++;
pS1++;
}
//memcpy(pS1,v,sizeof(v));
char* pS2 = palpha->getBuf();
//memset(pS2,0,palpha->size());
float* pA =(float*)pS2;
for(int i=0; i<nVertNum; i++)
pA[i]=1.0f;
pA[1]=0.5f;
//index
pidx->appendEmpty(geo.nIdxNum*sizeof(unsigned short));
char* pidxdt = pidx->getBuf();
memcpy(pidxdt, geo.pIdx,geo.nIdxNum*sizeof(unsigned short));
//Texture
BitmapData bmp = loadLocalImageSync("d:/temp/test.jpg");
LayaTexture* pTex1=new LayaTexture(NULL,NULL,200,200,0);
pTex1->copyImageToTexture(&bmp,0,1,1);
delete [] bmp.m_pImageData;
//创建材质
m_pMaterial = new Material();
m_pMaterial->m_fAlpha = 1.0f;
m_pMaterial->setShaderProgram((Shader*)m_pShader);
m_pMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL;
m_pMaterial->m_fColor[0]=1;
m_pMaterial->m_pTexture[0] = pTex1;
m_pMaterial->m_bEnableZ=true;
namedData* pDefMaterialDesc = getDefaultMaterialNamedData();
namedData* pRundata = new namedData();
pRundata->add("g_worldmatrix",0,namedData::tp_mat4,1);
pRundata->add("g_persmat",(int)(&((rundata*)0)->matpers), namedData::tp_mat4,1);
namedData* datadesc[2]={pDefMaterialDesc,pRundata};
renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, datadesc,2);
m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo;
m_RenderGroupData.m_pMaterial = m_pMaterial;
m_RenderGroupData.m_nBegin=0;
m_RenderGroupData.m_nEnd=idxnum;
//TODO
glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
int a=0;
}
void renderFrame(long,bool){
glClearColor(0.4f,0.2f,0.2f,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Matrix44 matw;
static float f=(Pi/4.0f);
f+=0.01f;
matw = Matrix44::CreateFromAxisAngle(float3(1,1.0f,0),f);
Matrix44 matper = Matrix44::CreatePerspective(800,600,1,10);
Matrix44& mat = m_RunData.matworld;
matw.M43 = -2;
mat = matw;
//mat.M41=sinf(f);
//mat.M43 = 0.6f;
Matrix44& persmat = m_RunData.matpers;
persmat =Matrix44::CreatePerspectiveFieldOfView(80.0f*Pi/180.0f,1.0f,0.1f,10.0f);
char* pdata[2];
pdata[0]=(char*)m_pMaterial;
pdata[1]=(char*)&m_RunData;
if(0)
renderer::renderMesh(&m_mesh, &m_RenderGroupData, (char**)pdata, 2);
else{
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
GLuint texs[2]={m_pMaterial->m_pTexture[0]->m_pGpuTexture,m_pMaterial->m_pTexture[0]->m_pGpuTexture};
renderer::renderMesh1(&m_mesh,m_RenderGroupData.m_nBegin, m_RenderGroupData.m_nEnd, m_pMaterial->m_pShaderProgram->m_nProgram,
(ShaderLinkInfo*)m_RenderGroupData.m_pShaderInfo, (int*)texs,2,(int*)texs,2,pdata,2);
}
mat.M41=0.2f;
//renderer::renderMesh(&m_mesh, &m_RenderGroupData, (char**)pdata, 2);
}
virtual void invalidGLRes() {}
virtual void freeGLRes() {}
virtual void setProcess(ProcessInterface* p_pCurProcess) {}
mesh m_mesh;
gpuProgram* m_pShader;
Material* m_pMaterial;
rundata m_RunData;
ShaderLinkInfo m_ShaderInfo;
RenderGroupData m_RenderGroupData;
};
render3d_1 renderor;
GLEnvThread gl;
gl.init(&renderor,800,600);
winWindows::handleMessage(NULL);
}
void _1_2_1_test3dmodel(){
class Renderer:public IGLRender{
};
}
void _2_1_test(){
Process proc(NULL);
LayaTexture* pTex = new LayaTexture(NULL,NULL,2048,2048,0);
pTex->setScale( 2,3,2,3);
BitmapData bmpdata;
createGridBmp(bmpdata,20,20,4);
//
BitmapData downd;
int frac[]={1,2,1,2};
downsampleBmp(bmpdata,downd,frac,false);
ImageBaseInfo ifo={downd.m_nWidth,downd.m_nHeight,32};
saveAsJpeg(downd.m_pImageData, ifo,"d:/temp/ss.jpg");
int borderFlag = ResBase::BOARDER_TYPE_RIGHT|ResBase::BOARDER_TYPE_BOTTOM;
//这个函数会缩小贴图
//pTex->copyImageToTexture(&bmpdata,borderFlag,1,1);
//pTex->mergeTexture(&bmpdata,borderFlag,0,0,1,1);
int rssz = pTex->getResSize();
int width = pTex->getWidth();
}
void _3_1_testdrawImageCB(resStateDispatcher*, bool* bEnd){
*bEnd=true;
}
void _3_1_testOnUpdate(void* pParam){
if(pParam){
int* pPars=(int*)pParam;
RenderImg* pRImg = (RenderImg*)pPars[0];
LayaContext* pCtx = (LayaContext*)pPars[1];
//p_nPaintKey为0则不会引起重新更新mesh
//pRImg->render(pCtx,0,NULL,0,0,pRImg->m_pImage->getWidth(),pRImg->m_pImage->getHeight());
pRImg->render(pCtx,1,NULL,0.0f,0.0f,(float)pRImg->m_pImage->getWidth(),(float)pRImg->m_pImage->getHeight());
}
}
void _3_1_testdrawImage(){
ConchRender* pRender = new ConchRender();
Process* pProc = new Process(NULL);
pProc->m_onprocessupdate = _3_1_testOnUpdate;
pRender->setProcess(pProc);
pProc->setRunParam("not.exist.js","");
pProc->active();
Sleep(100);
//Node* n1 = new Node(pProc,0,NULL);
Image img("");
bool bLoadEnd=false;
img.setSrc(pProc,"d:/temp/test.jpg");// gameicon.png");
img.setOnReadyCB(boost::bind(_3_1_testdrawImageCB,_1,&bLoadEnd));
//img.rect(0,0,100,100);
{int i=0; while(!bLoadEnd && i<1000){i++;Sleep(10);}}
//LayaContext ctx(NULL, pProc);
//TODO 问题 process中会自动创建一个 rootcontext, 是不是有点不灵活
LayaContext* pRootCtx = pProc->getRootContext();
pRootCtx->transform(1,0,0,1,0,0);
pRootCtx->disableClip(true);
//下面的正常是在js线程中
RenderImg ri;
ri.setImg(&img);
ri.render(pRootCtx,0,NULL,0,0,100,100);
void* param[2];
param[0]=&ri;
param[1]=pRootCtx;
pProc->m_pOnProcessUpdateParam = param;
GLEnvThread gl;
gl.init(pRender,800,600);
winWindows::handleMessage(NULL);
//Sleep(10000);
//delete n1;
}
void init_3(){
}
void uninit_3(){
}
void _0_1_test(){
}
*/
void _1_testRender_GLTread_simp() {
class TestRender :public JCIGLRender {
public:
struct Vertex {
float pos[3];
int color;
Vertex(float x, float y, float z, int c) {
pos[0] = x; pos[1] = y; pos[2] = z;
color = c;
}
};
int nFrmNum = 0;
std::function<void()> funcExit;
JCConchMesh* m_pMesh = nullptr;
JCGpuProgramTemplate* m_pShaderTemp = nullptr;
JCGpuProgram* m_pProg = nullptr;
JCMaterial* m_pMaterial = nullptr;
JCShaderLink_Vertex m_LinkVertex;
JCShaderLink_Uniform m_LinkUniform;
JCRenderGroupData m_RenderGroup;
TestRender(std::function<void()> f) {
funcExit = f;
}
virtual void onGLReady() {
m_pMesh = new JCConchMesh();
m_pMesh->regVertexDesc({ { "g_Pos",GL_FLOAT_VEC3 },{ "color",GL_INT } }, 1);
m_pShaderTemp = new JCGpuProgramTemplate(
R"(
attribute vec3 g_Pos;
void main(){
gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0);
}
)",
R"(
precision mediump float;
void main(){
gl_FragColor=vec4(1,1,0,1);
}
)");
m_pProg = m_pShaderTemp->getInst("", 0);
int nProg = m_pProg->getGpuProgram();
m_pMaterial = new JCMaterial();
m_pMaterial->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER);
m_pMaterial->setAlpha(1.0f);
m_pMaterial->setShaderProgram(m_pProg);
JCNamedData* pMaterialDesc = m_pMaterial->getNamedData();
JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1);
JCRenderer::link_shader_vertex_uniformdata(m_LinkVertex, m_LinkUniform, &VDesc, m_pProg, &pMaterialDesc, 1,nullptr);
JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMaterial, 4, {
-0.05f,0.05f,0.5f,0 ,
0.05f,0.05f,0.5f,0 ,
0.05f,-0.05f,0.5f,0 ,
-0.05f,-0.05f,0.5f,0
},{
0,1,2,2,3,0
});
pGroup->m_pShaderVertexInfo = &m_LinkVertex;
pGroup->m_pShaderUniformInfo = &m_LinkUniform;
}
virtual void renderFrame(long p_nCurrentFrame, bool) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.7f, 0.7f,0.7f, 1.0f);
nFrmNum++;
if (nFrmNum > 100) {
funcExit();
}
auto sttm = tmGetCurms();
for (int i = 0; i < 100000; i++) {
JCRenderer::renderMesh(m_pMesh, &m_pMesh->m_vRenderGroupData[0], nullptr, 0);
}
int dt = tmGetCurms() - sttm;
LOGE("+++++ dt=%d",dt);
}
virtual void invalidGLRes() {
}
virtual void freeGLRes() {
}
};
GLEnvThread gl;
TestRender render([&gl]() { gl.m_pWindows->close(); });
gl.init(&render, 800, 600);
winWindows::handleMessage(NULL);
}
void _1_testRender_GLTread_multiGroups() {
//不同材质
//不同面类型
//不同顶点格式
class TestRender :public JCIGLRender {
public:
struct Vertex {
float pos[3];
int color;
Vertex(float x, float y, float z, int c) {
pos[0] = x; pos[1] = y; pos[2] = z;
color = c;
}
};
int nFrmNum = 0;
std::function<void()> funcExit;
JCConchMesh* m_pMesh = nullptr;
JCGpuProgramTemplate* m_pTemp1= nullptr;
JCGpuProgramTemplate* m_pTemp2 = nullptr;
JCGpuProgramTemplate* m_pTemp3 = nullptr;
JCGpuProgram* m_pProg = nullptr;
JCGpuProgram* m_pProg1 = nullptr;
JCGpuProgram* m_pProg2 = nullptr;
JCMaterial* m_pMtl = nullptr;
JCMaterial* m_pMtl1 = nullptr;
JCMaterial* m_pMtl2 = nullptr;
JCShaderLink_Vertex m_LinkV,m_LinkV1,m_LinkV2;
JCShaderLink_Uniform m_LinkU, m_LinkU1, m_LinkU2;
JCRenderGroupData m_RenderGroup;
TestRender(std::function<void()> f) {
funcExit = f;
}
virtual void onGLReady() {
m_pMesh = new JCConchMesh();
m_pMesh->regVertexDesc({ { "g_Pos",GL_FLOAT_VEC3 },{ "color",GL_INT } }, 1);
m_pMesh->regVertexDesc({ {"g_Pos",GL_FLOAT_VEC2} }, 2);
//mtl
m_pProg = (new JCGpuProgramTemplate(
R"(
attribute vec3 g_Pos;
void main(){
gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0);
}
)", R"(
precision mediump float;
void main(){
gl_FragColor=vec4(1,1,0,1);
}
)"))->getInst("",0);
m_pMtl = new JCMaterial();
m_pMtl->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER);
m_pMtl->setAlpha(1.0f);
m_pMtl->setShaderProgram(m_pProg);
//mtl1
m_pProg1 = (new JCGpuProgramTemplate(R"(
attribute vec3 g_Pos;
void main(){
gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0);
}
)", R"(
precision mediump float;
void main(){
gl_FragColor=vec4(1,0,0,1);
}
)"))->getInst("",0);
m_pMtl1 = new JCMaterial();
m_pMtl1->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER);
m_pMtl1->setAlpha(1.0f);
m_pMtl1->setShaderProgram(m_pProg1);
//mtl2
m_pProg2 = (new JCGpuProgramTemplate(R"(
attribute vec2 g_Pos;
void main(){
gl_Position = vec4(g_Pos.x, g_Pos.y, 0.5, 1.0);
}
)", R"(
precision mediump float;
void main(){
gl_FragColor=vec4(0,1.0,0,1.0);
}
)"))->getInst("",0);
m_pMtl2 = new JCMaterial();
m_pMtl2->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER);
m_pMtl2->setAlpha(1.0f);
m_pMtl2->setShaderProgram(m_pProg1);
//link
JCNamedData* pMaterialDesc = m_pMtl->getNamedData();
JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1);
JCVertexDesc& VDesc1 = m_pMesh->getVertexDesc(2);
JCRenderer::link_shader_vertex_uniformdata(
m_LinkV, m_LinkU, &VDesc, m_pProg, &pMaterialDesc, 1,
nullptr
);
JCRenderer::link_shader_vertex_uniformdata(
m_LinkV1,m_LinkU1, &VDesc, m_pProg1, &pMaterialDesc, 1,nullptr);
JCRenderer::link_shader_vertex_uniformdata(
m_LinkV2, m_LinkU2, &VDesc1, m_pProg2, &pMaterialDesc, 1,nullptr);
float xoff = -0.7f, yoff = 0.0f;
JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMtl, 4, {
-0.05f+xoff,0.05f+yoff,0.5f,0 ,
0.05f+xoff,0.05f+yoff,0.5f,0 ,
0.05f+xoff,-0.05f+yoff,0.5f,0 ,
-0.05f+xoff,-0.05f+yoff,0.5f,0
}, {
0,1,2,2,3,0
});
pGroup->m_pShaderVertexInfo = &m_LinkV;
pGroup->m_pShaderUniformInfo = &m_LinkU;
xoff = -0.59f;
m_pMesh->pushElements(1, m_pMtl, 4, {
-0.05f + xoff,0.05f + yoff,0.5f,0 ,
0.05f + xoff,0.05f + yoff,0.5f,0 ,
0.05f + xoff,-0.05f + yoff,0.5f,0 ,
-0.05f + xoff,-0.05f + yoff,0.5f,0
}, {
0,1,2,2,3,0
});
pGroup->m_pShaderVertexInfo = &m_LinkV1;
pGroup->m_pShaderUniformInfo = &m_LinkU1;
xoff = -0.48f;
pGroup= m_pMesh->pushElements(1, m_pMtl1, 4, {
-0.05f + xoff,0.05f + yoff,0.5f,0 ,
0.05f + xoff,0.05f + yoff,0.5f,0 ,
0.05f + xoff,-0.05f + yoff,0.5f,0 ,
-0.05f + xoff,-0.05f + yoff,0.5f,0
}, {
0,1,2,2,3,0
});
pGroup->m_pShaderVertexInfo = &m_LinkV1;
pGroup->m_pShaderUniformInfo = &m_LinkU1;
//画线
float w = 800;
float h = 600;
pGroup = m_pMesh->pushVertex(1, GL_LINE_STRIP, m_pMtl, 3, {
375.0f/w,117.0f/h,0.5f,0,
636.0f/w,405.0f/h,0.5f,0,
207.0f/w,405.0f/h,0.5f,0
});
pGroup->m_pShaderVertexInfo = &m_LinkV;
pGroup->m_pShaderUniformInfo = &m_LinkU;
//不同的顶点格式
pGroup = m_pMesh->pushVertex(2, GL_TRIANGLE_FAN, m_pMtl2, 7, {
325.0f / w,329.0f / h,
320.0f / w,155.0f / h,
486.0f / w,240.0f / h,
488.0f / w,410.0f / h,
319.0f / w,493.0f / h,
155.0f / w,412.0f / h,
152.0f / w,241.0f / h
});
pGroup->m_pShaderVertexInfo = &m_LinkV2;
pGroup->m_pShaderUniformInfo = &m_LinkU2;
}
virtual void renderFrame(long p_nCurrentFrame, bool) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
nFrmNum++;
if (nFrmNum > 10000) {
funcExit();
}
for (auto& g : m_pMesh->m_vRenderGroupData) {
JCRenderer::renderMesh(m_pMesh, &g, nullptr, 0);
}
}
virtual void invalidGLRes() {
}
virtual void freeGLRes() {
}
};
GLEnvThread gl;
TestRender render([&gl]() { gl.m_pWindows->close(); });
gl.init(&render, 800, 600);
winWindows::handleMessage(NULL);
}
void testCanvas_1() {
}
void _1_testRender_GLTread_mask() {
class TestRender :public JCIGLRender {
public:
struct Vertex {
float _x,_y,_u1,_v1,_u2,_v2;
int color;
Vertex(float x, float y, float u1, float v1, float u2, float v2, int c) {
_x = x; _y = y; _u1 = u1; _v1 = v1; _u2 = u2; _v2 = v2;
color = c;
}
};
int nFrmNum = 0;
std::function<void()> funcExit;
JCConchMesh* m_pMesh = nullptr;
JCGpuProgram* m_pProg = nullptr;
JCMaterial* m_pMaterial = nullptr;
JCShaderLink_Vertex m_LinkInfoV;
JCShaderLink_Uniform m_LinkInfoU;
JCRenderGroupData m_RenderGroup;
//JCImage m_imgBk, m_imgMask;
JCTexture *m_pTex1, *m_pTex2;
TestRender(std::function<void()> f) {
funcExit = f;
}
virtual void onGLReady() {
m_pMesh = new JCConchMesh();
m_pMesh->regVertexDesc({ { "POSUV",GL_FLOAT_VEC4 },{ "uv2",GL_FLOAT_VEC2 } }, 1);
m_pProg = (new JCGpuProgramTemplate(R"(
attribute vec4 g_posuv;
attribute vec2 uv2;
varying vec2 texCoord1;
varying vec2 texCoord2;
void main(){
gl_Position = vec4(g_posuv.x, g_posuv.y, 0.5, 1.0);
texCoord1 = g_posuv.zw;
texCoord2 = uv2;
}
)",
R"(
precision mediump float;
varying vec2 texCoord1;
varying vec2 texCoord2;
uniform sampler2D g_Tex0;
uniform sampler2D g_Tex1;
void main(){
vec4 color1 = texture2D(g_Tex0, texCoord1.xy);
vec4 color2 = texture2D(g_Tex1, texCoord2.xy);//mask
gl_FragColor=vec4(color1.xyz,color1.w*color2.r);
}
)"))->getInst("",0);
int nProg = m_pProg->getGpuProgram();
m_pProg->m_pTemp->setSemantics("abc,ddd,g_posuv,POSUV");
m_pMaterial = new JCMaterial();
m_pMaterial->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER);
m_pMaterial->setAlpha(1.0f);
m_pMaterial->setShaderProgram(m_pProg);
JCNamedData* pMaterialDesc = m_pMaterial->getNamedData();
JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1);
JCRenderer::link_shader_vertex_uniformdata(
m_LinkInfoV,m_LinkInfoU, &VDesc, m_pProg, &pMaterialDesc, 1,nullptr);
JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMaterial, 4, {
-0.5f,0.5f,0,0,0,0,
0.5f,0.5f,0.5,0,1,0,
0.5f,-0.5f,0.5,0.5,1,1,
-0.5f,-0.5f,0,0.5,0,1
}, {
0,1,2,2,3,0
});
pGroup->m_pShaderUniformInfo = &m_LinkInfoU;
pGroup->m_pShaderVertexInfo = &m_LinkInfoV;
//两张贴图,模拟遮罩
JCBuffer buf;
BitmapData bmp;
readFileSync("F:/work/conch5gitsvn/ScriptTest/images/bg2.png", buf);
bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp);
m_pTex1 = new JCTexture(nullptr, TEXTURE_TYPE_NORMAL, bmp.m_nWidth,
bmp.m_nHeight);
m_pTex1->mergeBitmapDataToTexture(&bmp, (BOARDER_TYPE)0, 0, 0);
m_pMaterial->setTexture(0, m_pTex1);
readFileSync("F:/work/conch5gitsvn/ScriptTest/images/mask.png", buf);
b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp);
m_pTex2 = new JCTexture(nullptr, TEXTURE_TYPE_NORMAL, bmp.m_nWidth,
bmp.m_nHeight);
m_pTex2->mergeBitmapDataToTexture(&bmp, (BOARDER_TYPE)0, 0, 0);
m_pMaterial->setTexture(1, m_pTex2);
}
virtual void renderFrame(long p_nCurrentFrame, bool) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
glEnable(GL_BLEND);
nFrmNum++;
if (nFrmNum > 10000) {
funcExit();
}
JCRenderer::renderMesh(m_pMesh, &m_pMesh->m_vRenderGroupData[0], nullptr, 0);
}
virtual void invalidGLRes() {
}
virtual void freeGLRes() {
}
};
GLEnvThread gl;
TestRender render([&gl]() { gl.m_pWindows->close(); });
gl.init(&render, 800, 600);
winWindows::handleMessage(NULL);
}
void testMain() {
//_1_testRender_GLTread_simp();
//_1_testRender_GLTread_multiGroups();
_1_testRender_GLTread_mask();
/*
//TODO 下面这个不太方便
g_DecThread = new workerThread(true);
g_DecThread->setThreadName("image decode");
_1_2_1_test3d();
_1_2_1_test3dmodel();
_1_1_2_test();
//_2_1_test();
init_3();
_3_1_testdrawImage();
uninit_3();
_1_1_1_test();
//testRender3D_1();
delete g_DecThread;
*/
}
ADDTESTCASE(testMain, "renderTest");
}
#endif