1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
void ShadowRenderComponent::drawNextFrame() {
math::Vec3f centerLight = g2d::AmbientLight::getAmbientLight().getLightCenter();
View lightView = View(view.getSize().x, view.getSize().y, -g2d::AmbientLight::getAmbientLight().getHeight(), g2d::AmbientLight::getAmbientLight().getHeight());
lightView.setCenter(centerLight);
math::Vec3f forward = view.getPosition() - lightView.getPosition();
math::Vec3f target = lightView.getPosition() + forward;
lightView.lookAt(target.x, target.y, target.z);
stencilBuffer->setView(lightView);
math::Vec3f v = lightView.getPosition() - view.getPosition();
RenderStates states;
states.shader = buildShadowMapShader.get();
physic::BoundingBox viewArea = view.getViewVolume();
math::Vec3f position (viewArea.getPosition().x,viewArea.getPosition().y, view.getPosition().z);
math::Vec3f size (viewArea.getWidth(), viewArea.getHeight(), 0);
for (unsigned int i = 0; i < m_instances.size(); i++) {
states.texture = m_instances[i].getMaterial().getTexture();
if (m_instances[i].getMaterial().getTexture() != nullptr) {
buildShadowMapShader->setParameter("haveTexture", 1);
} else {
buildShadowMapShader->setParameter("haveTexture", 0);
}
stencilBuffer->draw(m_instances[i].getAllVertices(), states);
}
stencilBuffer->display();
stencilBufferTile->setPosition(position);
shadowMap->setView(view);
math::Matrix4f biasMatrix(0.5f, 0.0f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 0.5f, 0.0f,
0.5f, 0.5f, 0.5f, 1.f);
math::Matrix4f depthBiasMatrix = biasMatrix * view.getViewMatrix().getMatrix() * view.getProjMatrix().getMatrix();
perPixShadowShader->setParameter("depthBiasMatrix", depthBiasMatrix.transpose());
states.shader = perPixShadowShader.get();
for (unsigned int i = 0; i < m_instances.size(); i++) {
states.texture = m_instances[i].getMaterial().getTexture();
if (m_instances[i].getMaterial().getTexture() != nullptr) {
perPixShadowShader->setParameter("haveTexture", 1);
} else {
perPixShadowShader->setParameter("haveTexture", 0);
}
for (unsigned int j = 0; j < m_instances[i].getVertexArrays().size(); j++) {
states.transform = m_instances[i].getTransforms()[j];
math::Vec3f shadowOrigin, shadowCenter, shadowScale(1.f, 1.f, 1.f), shadowRotationAxis;
float shadowRotationAngle = 0;
std::cout<<"entity adr : "<<m_instances[i].getVertexArrays()[j].getEntity()<<std::endl;
if (m_instances[i].getVertexArrays()[j].getEntity() != nullptr && m_instances[i].getVertexArrays()[j].getEntity()->getParent() != nullptr) {
Entity* entity = m_instances[i].getVertexArrays()[j].getEntity()->getParent();
if (entity->isModel()) {
shadowCenter = static_cast<Model*>(entity)->getShadowCenter();
shadowScale = static_cast<Model*>(entity)->getShadowScale();
shadowRotationAxis = static_cast<Model*>(entity)->getShadowRotationAxis();
shadowRotationAngle = static_cast<Model*>(entity)->getShadowRotationAngle();
shadowOrigin = static_cast<Model*>(entity)->getShadowOrigin();
}
}
TransformMatrix tm;
tm.setOrigin(shadowOrigin);
tm.setScale(shadowScale);
tm.setRotation(shadowRotationAxis, shadowRotationAngle);
tm.setTranslation(shadowOrigin + shadowCenter);
tm.update();
perPixShadowShader->setParameter("shadowProjMat", tm.getMatrix().transpose());
shadowMap->draw(m_instances[i].getVertexArrays()[j], states);
}
}
RectangleShape rect(size * 2.f);
rect.setPosition(position - size * 0.5f);
rect.setFillColor(sf::Color(100, 100, 100, 128));
shadowMap->draw(rect);
shadowMap->display();
shadowTile->setPosition(position);
} |
Partager