working with broken rendering on windows

This commit is contained in:
emil.kabirov committed 2018-10-20 12:44:27 +05:00
1 parent a913a807f3
commit 5859972935
13 files changed
+16573 -131

No files matched your search

+129 -99
View File
@@ -32,6 +32,9 @@ extern bool SnowPref;
boost::mutex m2;
TPanoramicCamera mCamera;
const float cameraDistance = 100.f;
std::vector<int> iceIndexes;
class LoadingQueueVisitor : public boost::static_visitor<void>
{
@@ -67,43 +70,74 @@ TAndroidApplication::TAndroidApplication()
void TAndroidApplication::Serialize(boost::property_tree::ptree& propertyTree)
{
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree.get_child("Ices"))
{
std::string modelName = v.second.get<std::string>("ModelName");
float posx = v.second.get<float>("PosX");
float posz = v.second.get<float>("PosZ");
float angle = v.second.get<float>("Angle", 0.f);
float scale = v.second.get<float>("Scale", 1.f);
Matrix4f iceTransformation = Affine3f(Scaling(scale)).matrix();
Matrix3f rotation(Quaternionf(0, cos(angle*pi / 360.f), 0, sin(angle*pi / 360.f)).toRotationMatrix());
iceTransformation = Affine3f(rotation).matrix() * iceTransformation;
iceTransformation = Affine3f(Translation3f(posx, 0, posz)).matrix() * iceTransformation;
iceTransformations.push_back(iceTransformation);
}
}
float myMin(float a, float b)
{
return a < b ? a : b;
}
float myMax(float a, float b)
{
return a > b ? a : b;
}
void TAndroidApplication::LoadModels()
{
auto objData = loadObjFile("mountain/mountain.obj", "");
auto objData = loadObjFile("mountain/mountain2.obj", "");
mountain = ObjDataToRenderPairs(objData)[0][0];
mountainTransformation = Affine3f(Scaling(0.5f)).matrix();
Matrix3f rotation(Quaternionf(0, 1 * sin(pi / 8 + pi / 2), 0, 1 * cos(pi / 8 + pi / 2)).toRotationMatrix());
mountainTransformation = Affine3f(rotation).matrix() * mountainTransformation;
ResourceManager->TexList.AddTexture("mountain.png");
mountain.first.SamplerMap[CONST_STRING_TEXTURE_UNIFORM] = "mountain.png";
objData = loadObjFile("ice/ice.obj", "");
ice = ObjDataToRenderPairs(objData)[0][0];
Vector3f size = objData.models[0].maxCorner - objData.models[0].minCorner;
float radius = myMax(size[0], myMax(size[1], size[2])) / 2;
mountainTransformation = Affine3f(Scaling(cameraDistance / radius * 0.25f)).matrix();
//Matrix3f rotation(Quaternionf(0, 1 * sin(pi / 8 + pi / 2), 0, 1 * cos(pi / 8 + pi / 2)).toRotationMatrix());
//mountainTransformation = Affine3f(rotation).matrix() * mountainTransformation;
//mountainTransformation = Affine3f(Translation3f(0, 0, -size[2] / 2.f)).matrix() * mountainTransformation;
for (int i = 1; i <= 6; ++i)
{
objData = loadObjFile("ice/ice" + std::to_string(i) + ".obj", "");
ices[i - 1] = ObjDataToRenderPairs(objData)[0][0].second;
}
size = objData.models[0].maxCorner - objData.models[0].minCorner;
Vector3f centerShift = -(objData.models[0].maxCorner + objData.models[0].minCorner) / 2;
radius = myMax(size[0], myMax(size[1], size[2])) / 2;
ResourceManager->TexList.AddTexture("ice/Textures/ice1.png");
ResourceManager->TexList.AddTexture("ice/Textures/ice2.png");
ResourceManager->TexList.AddTexture("ice/Textures/ice3.png");
std::shared_ptr<boost::property_tree::ptree> p = FileToPropertyTree("ices.xml");
std::shared_ptr<boost::property_tree::ptree> p = FileToPropertyTree("ices.json");
Serialize(*p);
for (auto ice : p->get_child("ices"))
{
TRenderParams params;
Vector3f position = JSONVectorReader::readVector3f(ice.second.get_child("position"));
float scale = ice.second.get<float>("scale");
float angle = ice.second.get<float>("angle");
iceIndexes.push_back(ice.second.get<int>("type"));
params.SamplerMap[CONST_STRING_TEXTURE_UNIFORM] = "ice" + ice.second.get<std::string>("texture") + ".png";
iceParams.push_back(params);
Matrix4f iceTransformation = Affine3f(Translation3f(centerShift)).matrix();
iceTransformation = Affine3f(Scaling(cameraDistance / radius * 0.1f * scale)).matrix() * iceTransformation;
//Matrix3f rotation(Quaternionf(0, cos(angle*pi / 360.f), 0, sin(angle*pi / 360.f)).toRotationMatrix());
//iceTransformation = Affine3f(rotation).matrix() * iceTransformation;
iceTransformation = Affine3f(Translation3f(position)).matrix() * iceTransformation;
iceTransformations.push_back(iceTransformation);
}
//Serialize(*p);
}
void TAndroidApplication::AddFrameBuffers()
@@ -118,51 +152,29 @@ void TAndroidApplication::DrawSceneWithoutWater(bool inv)
Renderer->PushProjectionMatrix(1,1);
Renderer->LoadIdentity();
Renderer->PushSpecialMatrix(Matrix4f::Identity());
if (inv)
if (TimeOfDayPref == 2)
{
if (TimeOfDayPref == 2)
{
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky_night.png"]);
}
else
{
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky.png"]);
}
Renderer->DrawRect(Vector2f(0.0f, 0.56f), Vector2f(1.f, 0.f), Vector2f(0.5f + SkyTexShift, 0.f), Vector2f(1.f + SkyTexShift, 1.f));
if (TimeOfDayPref == 1)
{
glClear(GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["final_cloud.png"]);
Renderer->DrawRect(Vector2f(0.0f, 0.56f), Vector2f(4.f, 0.f), Vector2f(0.0f + SkyTexShift + CloudTimer, 0.f), Vector2f(1.f + SkyTexShift + CloudTimer, 0.5f));
}
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky_night.png"]);
}
else
{
if (TimeOfDayPref == 2)
{
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky_night.png"]);
}
else
{
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky.png"]);
}
Renderer->DrawRect(Vector2f(0.0f, 0.54f), Vector2f(1.f, 1.f), Vector2f(0.5f + SkyTexShift, 0.f), Vector2f(1.f + SkyTexShift, 1.f));
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky.png"]);
}
if (TimeOfDayPref == 1)
{
glClear(GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["final_cloud.png"]);
Renderer->DrawRect(Vector2f(0.0f, 0.54f), Vector2f(4.f, 1.f), Vector2f(0.0f + SkyTexShift + CloudTimer, 0.f), Vector2f(1.f + SkyTexShift + CloudTimer, 0.5f));
}
Renderer->DrawRect(Vector2f(0.0f, 0.56f), Vector2f(1.f, 0.f), Vector2f(0.5f + SkyTexShift, 0.f), Vector2f(1.f + SkyTexShift, 1.f));
if (TimeOfDayPref == 1)
{
glClear(GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["final_cloud.png"]);
Renderer->DrawRect(Vector2f(0.0f, 0.56f), Vector2f(4.f, 0.f), Vector2f(0.0f + SkyTexShift + CloudTimer, 0.f), Vector2f(1.f + SkyTexShift + CloudTimer, 0.5f));
}
Renderer->PopMatrix();
Renderer->PopProjectionMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
@@ -170,12 +182,16 @@ void TAndroidApplication::DrawSceneWithoutWater(bool inv)
if (inv)
{
Renderer->PushMatrix();
Renderer->TranslateMatrix(Vector3f(0,0.1f,0));
Renderer->ScaleMatrix(Vector3f(1, -1, 1));
}
Renderer->PushShader("SimplelightShader");
RenderUniform3fv("LightDirection", Vector3f(1, 1, 1).data());
Vector3f dayColor = Vector3f(0,0,0);
Vector3f nightColor = Vector3f(0, 0.1f, 0.2f);
@@ -200,35 +216,45 @@ void TAndroidApplication::DrawSceneWithoutWater(bool inv)
}
Renderer->PushPerspectiveProjectionMatrix(pi/6, Renderer->GetMatrixWidth() / Renderer->GetMatrixHeight(), 1.f, 450.f);
Renderer->PushPerspectiveProjectionMatrix(pi/6, Renderer->GetMatrixWidth() / Renderer->GetMatrixHeight(), 1.f, 450.f);
Renderer->PushMatrix();
//mCamera.SetCamView();
{
Renderer->PushMatrix();
Renderer->AddMatrix(mountainTransformation);
//RenderUniform4fv("light")
TRenderParamsSetter setter(mountain.first);
Renderer->DrawTriangleList(mountain.second);
Renderer->PopMatrix();
}
{
for (int i = 0; i < iceTransformations.size(); i++)
{
Renderer->PushSpecialMatrix(mountainTransformation);
Renderer->PushMatrix();
Renderer->AddMatrix(iceTransformations[i]);
//RenderUniform4fv("light")
TRenderParamsSetter setter(mountain.first);
Renderer->DrawTriangleList(mountain.second);
auto& renderPair = ices[iceIndexes[i] - 1];
TRenderParamsSetter setter(iceParams[i]);
Renderer->DrawTriangleList(ices[iceIndexes[i] - 1]);
Renderer->PopMatrix();
}
}
{
TRenderParamsSetter setter(ice.first);
Renderer->PopMatrix();
Renderer->PopProjectionMatrix();\
for (int i = 0; i < iceTransformations.size(); i++)
{
Renderer->PushSpecialMatrix(iceTransformations[i]);
if (inv)
{
Renderer->PopMatrix();
}
Renderer->DrawTriangleList(ice.second);
Renderer->PopMatrix();
}
}
Renderer->PopProjectionMatrix();
Renderer->PopShader();
Renderer->PopShader();
}
void TAndroidApplication::DrawSnow()
@@ -252,7 +278,7 @@ void TAndroidApplication::DrawSnow()
void TAndroidApplication::DrawAllScene(bool toScreen)
{
glClearColor(0.f, 0.f, 0.f, 1.0f);
glClearColor(1.f, 0.f, 1.f, 1.0f);
//glClearColor(1.f, 1.f, 1.f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
@@ -378,21 +404,24 @@ void TAndroidApplication::InnerInit()
CheckGlError();
boost::get<TPanoramicCamera>(Renderer->Camera).MovePhi(pi/32);
boost::get<TPanoramicCamera>(Renderer->Camera).MovePhi(pi / 32);
mCamera.MovePhi(pi/32);
if (Renderer->GetScreenWidth() > Renderer->GetScreenHeight())
{
boost::get<TPanoramicCamera>(Renderer->Camera).MoveDist(30.f);
mCamera.MoveDist(cameraDistance);
}
else
{
boost::get<TPanoramicCamera>(Renderer->Camera).MoveDist(45.f);
boost::get<TPanoramicCamera>(Renderer->Camera).MoveDist(30.f);
mCamera.MoveDist(cameraDistance);
}
boost::get<TPanoramicCamera>(Renderer->Camera).CalcCamVec();
mCamera.CalcCamVec();
CheckGlError();
@@ -400,7 +429,7 @@ void TAndroidApplication::InnerInit()
//ResourceManager->LightManager.SetLightDirection(Vector3f(1, -1, 0));
//AddFrameBuffers();
AddFrameBuffers();
//Renderer->SetPerspectiveFullScreenViewport();
@@ -450,13 +479,13 @@ void TAndroidApplication::InnerDraw()
m2.lock();
if (!Loaded)
{
glClearColor(0.f, 0.f, 0.f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["ScreenshotTexture"]);
Renderer->PushProjectionMatrix(1,1);
Renderer->LoadIdentity();
Renderer->DrawRect(Vector2f(0, 0), Vector2f(1.f, 1.f));
Renderer->PopProjectionMatrix();
//glClearColor(0.f, 0.f, 0.f, 1.0f);
//glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
//glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["ScreenshotTexture"]);
//Renderer->PushProjectionMatrix(1,1);
//Renderer->LoadIdentity();
//Renderer->DrawRect(Vector2f(0, 0), Vector2f(1.f, 1.f));
//Renderer->PopProjectionMatrix();
}
else
@@ -467,15 +496,15 @@ void TAndroidApplication::InnerDraw()
if (makeShot)
{
makeShot = false;
//makeShot = false;
Renderer->SwitchToFrameBuffer("ScreenshotFrame");
//Renderer->SwitchToFrameBuffer("ScreenshotFrame");
DrawAllScene(false);
//DrawAllScene(false);
ResourceManager->TexList.SaveTexDataToPlainBmpToUserData("file.bmp", ResourceManager->FrameManager.ReadFromBufferToTexData("ScreenshotFrame"));
//ResourceManager->TexList.SaveTexDataToPlainBmpToUserData("file.bmp", ResourceManager->FrameManager.ReadFromBufferToTexData("ScreenshotFrame"));
Renderer->SwitchToScreen();
//Renderer->SwitchToScreen();
}
}
@@ -539,12 +568,13 @@ void TAndroidApplication::InnerUpdate(size_t dt)
}
void TAndroidApplication::InnerOnMove(Vector2f shift)
void TAndroidApplication::InnerOnMove(Vector2f pos, Vector2f shift)
{
shift = Vector2f(shift[0]*Renderer->GetMatrixWidth()/static_cast<float>(Renderer->GetScreenWidth()), shift[1]*Renderer->GetMatrixHeight()/static_cast<float>(Renderer->GetScreenHeight()));
boost::get<TPanoramicCamera>(Renderer->Camera).MoveAlpha(-pi*shift[0]*0.1f);
boost::get<TPanoramicCamera>(Renderer->Camera).MoveAlpha(-pi * shift[0] * 0.01f);
mCamera.MoveAlpha(-pi*shift[0]*0.01f);
}
void TAndroidApplication::OnMouseDown(TMouseState& mouseState)
+3 -2
View File
@@ -50,7 +50,8 @@ public:
TRenderPair mountain;
Matrix4f mountainTransformation;
TRenderPair ice;
std::array<TTriangleList, 6> ices;
std::vector<TRenderParams> iceParams;
std::vector<Matrix4f> iceTransformations;
float WaterTimer;
@@ -69,7 +70,7 @@ public:
virtual void InnerUpdate(size_t dt);
virtual void InnerOnMove(Vector2f shift);
virtual void InnerOnMove(Vector2f pos, Vector2f shift) override;
virtual void OnMouseDown(TMouseState& mouseState);